﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Drawing;

namespace MassIntellect.Drawing
{
    public abstract partial class Shape
    {
        #region Статичные методы
        public static RectangleF NormalizeRect(RectangleF rect)
        {
            if (rect.Width < 0)
            {
                rect.X += rect.Width;
                rect.Width = Math.Abs(rect.Width);
            }
            if (rect.Height < 0)
            {
                rect.Y += rect.Height;
                rect.Height = Math.Abs(rect.Height);
            }
            return rect;
        }

        /// <summary>
        /// Нормализация вектора
        /// </summary>
        /// <param name="ax1">X-координата первой точки отрезка</param>
        /// <param name="ay1">Y-координата первой точки отрезка</param>
        /// <param name="ax2">X-координата второй точки отрезка</param>
        /// <param name="ay2">Y-координата второй точки отрезка</param>
        /// <returns>Координаты вектора</returns>
        public static PointF NormalizeVector(float ax1, float ay1, float ax2, float ay2)
        {
            return new PointF(ax2 - ax1, ay2 - ay1);
        }

        /// <summary>
        /// Длина отрезка
        /// </summary>
        /// <param name="ax1">X-координата первой точки отрезка</param>
        /// <param name="ay1">Y-координата первой точки отрезка</param>
        /// <param name="ax2">X-координата второй точки отрезка</param>
        /// <param name="ay2">Y-координата второй точки отрезка</param>
        /// <returns>Длина отрезка</returns>
        public static float LengthVector(float ax1, float ay1, float ax2, float ay2)
        {
            return (float)Math.Sqrt(Math.Pow(ax2 - ax1, 2) + Math.Pow(ay2 - ay1, 2));
        }

        /// <summary>
        /// Нахождение точки пересечения двух отрезков (если есть)
        /// </summary>
        /// <param name="ax1">X-координата первой точки отрезка a</param>
        /// <param name="ay1">Y-координата первой точки отрезка a</param>
        /// <param name="ax2">X-координата второй точки отрезка a</param>
        /// <param name="ay2">Y-координата второй точки отрезка a</param>
        /// <param name="bx1">X-координата первой точки отрезка b</param>
        /// <param name="by1">Y-координата первой точки отрезка b</param>
        /// <param name="bx2">X-координата второй точки отрезка b</param>
        /// <param name="by2">Y-координата второй точки отрезка b</param>
        /// <param name="crs">Точка пересечения</param>
        /// <returns>Пересекаются или нет</returns>
        public static bool JointVectors(float ax1, float ay1, float ax2, float ay2, float bx1, float by1, float bx2, float by2, out PointF crs)
        {
            crs = new PointF(float.NaN, float.NaN);

            float w = (ay2 - ay1) * (bx2 - bx1) - (by2 - by1) * (ax2 - ax1);
            if (w != 0)
            {
                float w1 = (by1 - ay1) * (bx2 - bx1) * (ax2 - ax1) + ax1 * (ay2 - ay1) * (bx2 - bx1) - bx1 * (by2 - by1) * (ax2 - ax1);
                float w2 = (bx1 - ax1) * (by2 - by1) * (ay2 - ay1) + ay1 * (ax2 - ax1) * (by2 - by1) - by1 * (bx2 - bx1) * (ay2 - ay1);
                crs.X = w1 / w;
                crs.Y = -w2 / w;
                return JointPointWithVector(crs.X, crs.Y, ax1, ay1, ax2, ay2) && JointPointWithVector(crs.X, crs.Y, bx1, by1, bx2, by2);
            }
            else
                return false;
        }

        /// <summary>
        /// Принадлежность точки отрезку
        /// </summary>
        /// <param name="x1">X-координата точки</param>
        /// <param name="y1">Y-координата точки</param>
        /// <param name="vx1">X-координата первой точки отрезка</param>
        /// <param name="vy1">Y-координата первой точки отрезка</param>
        /// <param name="vx2">X-координата второй точки отрезка</param>
        /// <param name="vy2">Y-координата второй точки отрезка</param>
        /// <returns>Принадлежит или нет</returns>
        public static bool JointPointWithVector(float x1, float y1, float vx1, float vy1, float vx2, float vy2)
        {
            return Math.Abs(LengthVector(vx1, vy1, vx2, vy2) - LengthVector(vx1, vy1, x1, y1) - LengthVector(x1, y1, vx2, vy2)) <= 0.001f;
        }

		///// <summary>
		///// Нахождение точек пересечения окружности и отрезка
		///// </summary>
		///// <param name="cx0">X-координата центра окружности</param>
		///// <param name="cy0">Y-координата центра окружности</param>
		///// <param name="cR">Радиус окружности</param>
		///// <param name="vx1">X-координата первой точки отрезка</param>
		///// <param name="vy1">Y-координата первой точки отрезка</param>
		///// <param name="vx2">X-координата второй точки отрезка</param>
		///// <param name="vy2">Y-координата второй точки отрезка</param>
		///// <param name="crs">Массив с уникальными точками пересечения</param>
		///// <returns>Пересекаются или нет</returns>
		//public static bool JointCircleWithVector(float cx0, float cy0, float cR, float vx1, float vy1, float vx2, float vy2, out PointF[] crs)
		//{
		//    crs = new PointF[4];
		//    // Формула нахождения координат получена с помощью Maple 13 (система уравнений, преобразование к языку java)
		//    var w = vy1 - vy2;
		//    var w1 = (-2 * vx2 * vx1 - 2 * vy2 * vy1 + vx2 * vx2 + vx1 * vx1 + vy2 * vy2 + vy1 * vy1);
		//    if (w1 != 0)
		//    {
		//        if (w != 0)
		//        {
		//            crs[0].X = (float)(-(vx1 * vy2) - (-(vy1 * vx2 * cx0) - (cx0 * vx1 * vy2) + (vy1 * vx1 * cx0) - (2 * cy0 * vy2 * vy1) + (vy2 * vx1 * vx1) + (vy1 * vy1 * cy0) + (vy1 * vx2 * vx2) - (vx2 * vy1 * vx1) + (vy2 * vy2 * cy0) - (vx1 * vy2 * vx2) + (cx0 * vx2 * vy2) + Math.Sqrt((6 * vy1 * vy1 * vx2 * cx0 * cy0 * vy2 - 6 * vy1 * vx2 * cx0 * vy2 * vy2 * cy0 + 6 * cx0 * vx1 * vy2 * vy2 * cy0 * vy1 - 6 * cx0 * vx1 * vy2 * vy1 * vy1 * cy0 + 2 * cy0 * vy2 * vy1 * vy1 * vx2 * vx1 + 2 * cy0 * vy2 * vy2 * vy1 * vx1 * vx2 - 4 * vx2 * vx1 * cy0 * cy0 * vy2 * vy1 + 4 * vx2 * vx1 * cR * cR * vy2 * vy1 + 2 * Math.Pow(vy2, 3) * vx1 * vx1 * cy0 - Math.Pow(vy2, 4) * vx1 * vx1 - Math.Pow(vy2, 4) * cx0 * cx0 + Math.Pow(vy2, 4) * cR * cR - Math.Pow(vy1, 4) * vx2 * vx2 - Math.Pow(vy1, 4) * cx0 * cx0 + Math.Pow(vy1, 4) * cR * cR - 2 * Math.Pow(vy1, 3) * vx2 * cx0 * cy0 - 2 * cx0 * vx1 * Math.Pow(vy2, 3) * cy0 + 2 * Math.Pow(vy1, 3) * vx1 * cx0 * cy0 - 4 * cy0 * vy2 * vy2 * vy1 * vx1 * vx1 - 4 * cy0 * vy2 * vy1 * vy1 * vx2 * vx2 + 2 * vy2 * vx1 * vx1 * vy1 * vy1 * cy0 - 2 * Math.Pow(vy1, 3) * cy0 * vx2 * vx1 + 2 * vy1 * vx2 * vx2 * vy2 * vy2 * cy0 - 2 * Math.Pow(vy2, 3) * cy0 * vx1 * vx2 + 2 * Math.Pow(vy2, 3) * cy0 * cx0 * vx2 + 2 * vx2 * vx1 * cy0 * cy0 * vy2 * vy2 + 2 * vx2 * vx1 * cy0 * cy0 * vy1 * vy1 - 2 * vx2 * vx1 * cR * cR * vy2 * vy2 - 2 * vx2 * vx1 * cR * cR * vy1 * vy1 - 4 * vy2 * vy2 * vy1 * vy1 * vx1 * vx2 + 6 * vy2 * vy2 * vy1 * vy1 * cx0 * vx1 + 6 * vy2 * vy2 * vy1 * vy1 * cx0 * vx2 - 6 * Math.Pow(vy2, 3) * vy1 * cx0 * vx1 - 6 * vy2 * Math.Pow(vy1, 3) * cx0 * vx2 + 2 * vx2 * vx2 * cy0 * cy0 * vy2 * vy1 - 2 * vx2 * vx2 * cR * cR * vy2 * vy1 + 2 * vx1 * vx1 * cy0 * cy0 * vy2 * vy1 - 2 * vx1 * vx1 * cR * cR * vy2 * vy1 + 2 * Math.Pow(vy2, 3) * vx1 * vy1 * vx2 - 2 * Math.Pow(vy2, 3) * cx0 * vy1 * vx2 + 2 * Math.Pow(vy1, 3) * vx1 * vy2 * vx2 - 2 * Math.Pow(vy1, 3) * cx0 * vx1 * vy2 + 2 * Math.Pow(vy1, 3) * cy0 * vx2 * vx2 - 6 * vy2 * vy2 * vy1 * vy1 * cx0 * cx0 + 6 * vy2 * vy2 * vy1 * vy1 * cR * cR + 2 * Math.Pow(vy2, 3) * vy1 * vx1 * vx1 + 2 * vy2 * Math.Pow(vy1, 3) * vx2 * vx2 + 4 * Math.Pow(vy2, 3) * vy1 * cx0 * cx0 + 4 * vy2 * Math.Pow(vy1, 3) * cx0 * cx0 - 4 * Math.Pow(vy2, 3) * vy1 * cR * cR - 4 * vy2 * Math.Pow(vy1, 3) * cR * cR - vx2 * vx2 * cy0 * cy0 * vy2 * vy2 - vx2 * vx2 * cy0 * cy0 * vy1 * vy1 + vx2 * vx2 * cR * cR * vy2 * vy2 + vx2 * vx2 * cR * cR * vy1 * vy1 - vx1 * vx1 * cy0 * cy0 * vy2 * vy2 - vx1 * vx1 * cy0 * cy0 * vy1 * vy1 + vx1 * vx1 * cR * cR * vy2 * vy2 + vx1 * vx1 * cR * cR * vy1 * vy1 + 2 * Math.Pow(vy2, 4) * cx0 * vx1 - vy2 * vy2 * vy1 * vy1 * vx2 * vx2 + 2 * Math.Pow(vy1, 4) * cx0 * vx2 - vy1 * vy1 * vx1 * vx1 * vy2 * vy2))) / w1 * vx2 + (-(vy1 * vx2 * cx0) - (cx0 * vx1 * vy2) + (vy1 * vx1 * cx0) - (2 * cy0 * vy2 * vy1) + (vy2 * vx1 * vx1) + (vy1 * vy1 * cy0) + (vy1 * vx2 * vx2) - (vx2 * vy1 * vx1) + (vy2 * vy2 * cy0) - (vx1 * vy2 * vx2) + (cx0 * vx2 * vy2) + Math.Sqrt((6 * vy1 * vy1 * vx2 * cx0 * cy0 * vy2 - 6 * vy1 * vx2 * cx0 * vy2 * vy2 * cy0 + 6 * cx0 * vx1 * vy2 * vy2 * cy0 * vy1 - 6 * cx0 * vx1 * vy2 * vy1 * vy1 * cy0 + 2 * cy0 * vy2 * vy1 * vy1 * vx2 * vx1 + 2 * cy0 * vy2 * vy2 * vy1 * vx1 * vx2 - 4 * vx2 * vx1 * cy0 * cy0 * vy2 * vy1 + 4 * vx2 * vx1 * cR * cR * vy2 * vy1 + 2 * Math.Pow(vy2, 3) * vx1 * vx1 * cy0 - Math.Pow(vy2, 4) * vx1 * vx1 - Math.Pow(vy2, 4) * cx0 * cx0 + Math.Pow(vy2, 4) * cR * cR - Math.Pow(vy1, 4) * vx2 * vx2 - Math.Pow(vy1, 4) * cx0 * cx0 + Math.Pow(vy1, 4) * cR * cR - 2 * Math.Pow(vy1, 3) * vx2 * cx0 * cy0 - 2 * cx0 * vx1 * Math.Pow(vy2, 3) * cy0 + 2 * Math.Pow(vy1, 3) * vx1 * cx0 * cy0 - 4 * cy0 * vy2 * vy2 * vy1 * vx1 * vx1 - 4 * cy0 * vy2 * vy1 * vy1 * vx2 * vx2 + 2 * vy2 * vx1 * vx1 * vy1 * vy1 * cy0 - 2 * Math.Pow(vy1, 3) * cy0 * vx2 * vx1 + 2 * vy1 * vx2 * vx2 * vy2 * vy2 * cy0 - 2 * Math.Pow(vy2, 3) * cy0 * vx1 * vx2 + 2 * Math.Pow(vy2, 3) * cy0 * cx0 * vx2 + 2 * vx2 * vx1 * cy0 * cy0 * vy2 * vy2 + 2 * vx2 * vx1 * cy0 * cy0 * vy1 * vy1 - 2 * vx2 * vx1 * cR * cR * vy2 * vy2 - 2 * vx2 * vx1 * cR * cR * vy1 * vy1 - 4 * vy2 * vy2 * vy1 * vy1 * vx1 * vx2 + 6 * vy2 * vy2 * vy1 * vy1 * cx0 * vx1 + 6 * vy2 * vy2 * vy1 * vy1 * cx0 * vx2 - 6 * Math.Pow(vy2, 3) * vy1 * cx0 * vx1 - 6 * vy2 * Math.Pow(vy1, 3) * cx0 * vx2 + 2 * vx2 * vx2 * cy0 * cy0 * vy2 * vy1 - 2 * vx2 * vx2 * cR * cR * vy2 * vy1 + 2 * vx1 * vx1 * cy0 * cy0 * vy2 * vy1 - 2 * vx1 * vx1 * cR * cR * vy2 * vy1 + 2 * Math.Pow(vy2, 3) * vx1 * vy1 * vx2 - 2 * Math.Pow(vy2, 3) * cx0 * vy1 * vx2 + 2 * Math.Pow(vy1, 3) * vx1 * vy2 * vx2 - 2 * Math.Pow(vy1, 3) * cx0 * vx1 * vy2 + 2 * Math.Pow(vy1, 3) * cy0 * vx2 * vx2 - 6 * vy2 * vy2 * vy1 * vy1 * cx0 * cx0 + 6 * vy2 * vy2 * vy1 * vy1 * cR * cR + 2 * Math.Pow(vy2, 3) * vy1 * vx1 * vx1 + 2 * vy2 * Math.Pow(vy1, 3) * vx2 * vx2 + 4 * Math.Pow(vy2, 3) * vy1 * cx0 * cx0 + 4 * vy2 * Math.Pow(vy1, 3) * cx0 * cx0 - 4 * Math.Pow(vy2, 3) * vy1 * cR * cR - 4 * vy2 * Math.Pow(vy1, 3) * cR * cR - vx2 * vx2 * cy0 * cy0 * vy2 * vy2 - vx2 * vx2 * cy0 * cy0 * vy1 * vy1 + vx2 * vx2 * cR * cR * vy2 * vy2 + vx2 * vx2 * cR * cR * vy1 * vy1 - vx1 * vx1 * cy0 * cy0 * vy2 * vy2 - vx1 * vx1 * cy0 * cy0 * vy1 * vy1 + vx1 * vx1 * cR * cR * vy2 * vy2 + vx1 * vx1 * cR * cR * vy1 * vy1 + 2 * Math.Pow(vy2, 4) * cx0 * vx1 - vy2 * vy2 * vy1 * vy1 * vx2 * vx2 + 2 * Math.Pow(vy1, 4) * cx0 * vx2 - vy1 * vy1 * vx1 * vx1 * vy2 * vy2))) / w1 * vx1 + (vy1 * vx2)) / w;
		//            crs[0].Y = (float)(-(vy1 * vx2 * cx0) - (cx0 * vx1 * vy2) + (vy1 * vx1 * cx0) - (2 * cy0 * vy2 * vy1) + (vy2 * vx1 * vx1) + (vy1 * vy1 * cy0) + (vy1 * vx2 * vx2) - (vx2 * vy1 * vx1) + (vy2 * vy2 * cy0) - (vx1 * vy2 * vx2) + (cx0 * vx2 * vy2) + Math.Sqrt((6 * vy1 * vy1 * vx2 * cx0 * cy0 * vy2 - 6 * vy1 * vx2 * cx0 * vy2 * vy2 * cy0 + 6 * cx0 * vx1 * vy2 * vy2 * cy0 * vy1 - 6 * cx0 * vx1 * vy2 * vy1 * vy1 * cy0 + 2 * cy0 * vy2 * vy1 * vy1 * vx2 * vx1 + 2 * cy0 * vy2 * vy2 * vy1 * vx1 * vx2 - 4 * vx2 * vx1 * cy0 * cy0 * vy2 * vy1 + 4 * vx2 * vx1 * cR * cR * vy2 * vy1 + 2 * Math.Pow(vy2, 3) * vx1 * vx1 * cy0 - Math.Pow(vy2, 4) * vx1 * vx1 - Math.Pow(vy2, 4) * cx0 * cx0 + Math.Pow(vy2, 4) * cR * cR - Math.Pow(vy1, 4) * vx2 * vx2 - Math.Pow(vy1, 4) * cx0 * cx0 + Math.Pow(vy1, 4) * cR * cR - 2 * Math.Pow(vy1, 3) * vx2 * cx0 * cy0 - 2 * cx0 * vx1 * Math.Pow(vy2, 3) * cy0 + 2 * Math.Pow(vy1, 3) * vx1 * cx0 * cy0 - 4 * cy0 * vy2 * vy2 * vy1 * vx1 * vx1 - 4 * cy0 * vy2 * vy1 * vy1 * vx2 * vx2 + 2 * vy2 * vx1 * vx1 * vy1 * vy1 * cy0 - 2 * Math.Pow(vy1, 3) * cy0 * vx2 * vx1 + 2 * vy1 * vx2 * vx2 * vy2 * vy2 * cy0 - 2 * Math.Pow(vy2, 3) * cy0 * vx1 * vx2 + 2 * Math.Pow(vy2, 3) * cy0 * cx0 * vx2 + 2 * vx2 * vx1 * cy0 * cy0 * vy2 * vy2 + 2 * vx2 * vx1 * cy0 * cy0 * vy1 * vy1 - 2 * vx2 * vx1 * cR * cR * vy2 * vy2 - 2 * vx2 * vx1 * cR * cR * vy1 * vy1 - 4 * vy2 * vy2 * vy1 * vy1 * vx1 * vx2 + 6 * vy2 * vy2 * vy1 * vy1 * cx0 * vx1 + 6 * vy2 * vy2 * vy1 * vy1 * cx0 * vx2 - 6 * Math.Pow(vy2, 3) * vy1 * cx0 * vx1 - 6 * vy2 * Math.Pow(vy1, 3) * cx0 * vx2 + 2 * vx2 * vx2 * cy0 * cy0 * vy2 * vy1 - 2 * vx2 * vx2 * cR * cR * vy2 * vy1 + 2 * vx1 * vx1 * cy0 * cy0 * vy2 * vy1 - 2 * vx1 * vx1 * cR * cR * vy2 * vy1 + 2 * Math.Pow(vy2, 3) * vx1 * vy1 * vx2 - 2 * Math.Pow(vy2, 3) * cx0 * vy1 * vx2 + 2 * Math.Pow(vy1, 3) * vx1 * vy2 * vx2 - 2 * Math.Pow(vy1, 3) * cx0 * vx1 * vy2 + 2 * Math.Pow(vy1, 3) * cy0 * vx2 * vx2 - 6 * vy2 * vy2 * vy1 * vy1 * cx0 * cx0 + 6 * vy2 * vy2 * vy1 * vy1 * cR * cR + 2 * Math.Pow(vy2, 3) * vy1 * vx1 * vx1 + 2 * vy2 * Math.Pow(vy1, 3) * vx2 * vx2 + 4 * Math.Pow(vy2, 3) * vy1 * cx0 * cx0 + 4 * vy2 * Math.Pow(vy1, 3) * cx0 * cx0 - 4 * Math.Pow(vy2, 3) * vy1 * cR * cR - 4 * vy2 * Math.Pow(vy1, 3) * cR * cR - vx2 * vx2 * cy0 * cy0 * vy2 * vy2 - vx2 * vx2 * cy0 * cy0 * vy1 * vy1 + vx2 * vx2 * cR * cR * vy2 * vy2 + vx2 * vx2 * cR * cR * vy1 * vy1 - vx1 * vx1 * cy0 * cy0 * vy2 * vy2 - vx1 * vx1 * cy0 * cy0 * vy1 * vy1 + vx1 * vx1 * cR * cR * vy2 * vy2 + vx1 * vx1 * cR * cR * vy1 * vy1 + 2 * Math.Pow(vy2, 4) * cx0 * vx1 - vy2 * vy2 * vy1 * vy1 * vx2 * vx2 + 2 * Math.Pow(vy1, 4) * cx0 * vx2 - vy1 * vy1 * vx1 * vx1 * vy2 * vy2))) / w1;
		//            crs[1].X = (float)(-(vx1 * vy2) + ((vy1 * vx2 * cx0) + (cx0 * vx1 * vy2) - (vy1 * vx1 * cx0) + (2 * cy0 * vy2 * vy1) - (vy2 * vx1 * vx1) - (vy1 * vy1 * cy0) - (vy1 * vx2 * vx2) + (vx2 * vy1 * vx1) - (vy2 * vy2 * cy0) + (vx1 * vy2 * vx2) - (cx0 * vx2 * vy2) + Math.Sqrt((6 * vy1 * vy1 * vx2 * cx0 * cy0 * vy2 - 6 * vy1 * vx2 * cx0 * vy2 * vy2 * cy0 + 6 * cx0 * vx1 * vy2 * vy2 * cy0 * vy1 - 6 * cx0 * vx1 * vy2 * vy1 * vy1 * cy0 + 2 * cy0 * vy2 * vy1 * vy1 * vx2 * vx1 + 2 * cy0 * vy2 * vy2 * vy1 * vx1 * vx2 - 4 * vx2 * vx1 * cy0 * cy0 * vy2 * vy1 + 4 * vx2 * vx1 * cR * cR * vy2 * vy1 + 2 * Math.Pow(vy2, 3) * vx1 * vx1 * cy0 - Math.Pow(vy2, 4) * vx1 * vx1 - Math.Pow(vy2, 4) * cx0 * cx0 + Math.Pow(vy2, 4) * cR * cR - Math.Pow(vy1, 4) * vx2 * vx2 - Math.Pow(vy1, 4) * cx0 * cx0 + Math.Pow(vy1, 4) * cR * cR - 2 * Math.Pow(vy1, 3) * vx2 * cx0 * cy0 - 2 * cx0 * vx1 * Math.Pow(vy2, 3) * cy0 + 2 * Math.Pow(vy1, 3) * vx1 * cx0 * cy0 - 4 * cy0 * vy2 * vy2 * vy1 * vx1 * vx1 - 4 * cy0 * vy2 * vy1 * vy1 * vx2 * vx2 + 2 * vy2 * vx1 * vx1 * vy1 * vy1 * cy0 - 2 * Math.Pow(vy1, 3) * cy0 * vx2 * vx1 + 2 * vy1 * vx2 * vx2 * vy2 * vy2 * cy0 - 2 * Math.Pow(vy2, 3) * cy0 * vx1 * vx2 + 2 * Math.Pow(vy2, 3) * cy0 * cx0 * vx2 + 2 * vx2 * vx1 * cy0 * cy0 * vy2 * vy2 + 2 * vx2 * vx1 * cy0 * cy0 * vy1 * vy1 - 2 * vx2 * vx1 * cR * cR * vy2 * vy2 - 2 * vx2 * vx1 * cR * cR * vy1 * vy1 - 4 * vy2 * vy2 * vy1 * vy1 * vx1 * vx2 + 6 * vy2 * vy2 * vy1 * vy1 * cx0 * vx1 + 6 * vy2 * vy2 * vy1 * vy1 * cx0 * vx2 - 6 * Math.Pow(vy2, 3) * vy1 * cx0 * vx1 - 6 * vy2 * Math.Pow(vy1, 3) * cx0 * vx2 + 2 * vx2 * vx2 * cy0 * cy0 * vy2 * vy1 - 2 * vx2 * vx2 * cR * cR * vy2 * vy1 + 2 * vx1 * vx1 * cy0 * cy0 * vy2 * vy1 - 2 * vx1 * vx1 * cR * cR * vy2 * vy1 + 2 * Math.Pow(vy2, 3) * vx1 * vy1 * vx2 - 2 * Math.Pow(vy2, 3) * cx0 * vy1 * vx2 + 2 * Math.Pow(vy1, 3) * vx1 * vy2 * vx2 - 2 * Math.Pow(vy1, 3) * cx0 * vx1 * vy2 + 2 * Math.Pow(vy1, 3) * cy0 * vx2 * vx2 - 6 * vy2 * vy2 * vy1 * vy1 * cx0 * cx0 + 6 * vy2 * vy2 * vy1 * vy1 * cR * cR + 2 * Math.Pow(vy2, 3) * vy1 * vx1 * vx1 + 2 * vy2 * Math.Pow(vy1, 3) * vx2 * vx2 + 4 * Math.Pow(vy2, 3) * vy1 * cx0 * cx0 + 4 * vy2 * Math.Pow(vy1, 3) * cx0 * cx0 - 4 * Math.Pow(vy2, 3) * vy1 * cR * cR - 4 * vy2 * Math.Pow(vy1, 3) * cR * cR - vx2 * vx2 * cy0 * cy0 * vy2 * vy2 - vx2 * vx2 * cy0 * cy0 * vy1 * vy1 + vx2 * vx2 * cR * cR * vy2 * vy2 + vx2 * vx2 * cR * cR * vy1 * vy1 - vx1 * vx1 * cy0 * cy0 * vy2 * vy2 - vx1 * vx1 * cy0 * cy0 * vy1 * vy1 + vx1 * vx1 * cR * cR * vy2 * vy2 + vx1 * vx1 * cR * cR * vy1 * vy1 + 2 * Math.Pow(vy2, 4) * cx0 * vx1 - vy2 * vy2 * vy1 * vy1 * vx2 * vx2 + 2 * Math.Pow(vy1, 4) * cx0 * vx2 - vy1 * vy1 * vx1 * vx1 * vy2 * vy2))) / w1 * vx2 - ((vy1 * vx2 * cx0) + (cx0 * vx1 * vy2) - (vy1 * vx1 * cx0) + (2 * cy0 * vy2 * vy1) - (vy2 * vx1 * vx1) - (vy1 * vy1 * cy0) - (vy1 * vx2 * vx2) + (vx2 * vy1 * vx1) - (vy2 * vy2 * cy0) + (vx1 * vy2 * vx2) - (cx0 * vx2 * vy2) + Math.Sqrt((6 * vy1 * vy1 * vx2 * cx0 * cy0 * vy2 - 6 * vy1 * vx2 * cx0 * vy2 * vy2 * cy0 + 6 * cx0 * vx1 * vy2 * vy2 * cy0 * vy1 - 6 * cx0 * vx1 * vy2 * vy1 * vy1 * cy0 + 2 * cy0 * vy2 * vy1 * vy1 * vx2 * vx1 + 2 * cy0 * vy2 * vy2 * vy1 * vx1 * vx2 - 4 * vx2 * vx1 * cy0 * cy0 * vy2 * vy1 + 4 * vx2 * vx1 * cR * cR * vy2 * vy1 + 2 * Math.Pow(vy2, 3) * vx1 * vx1 * cy0 - Math.Pow(vy2, 4) * vx1 * vx1 - Math.Pow(vy2, 4) * cx0 * cx0 + Math.Pow(vy2, 4) * cR * cR - Math.Pow(vy1, 4) * vx2 * vx2 - Math.Pow(vy1, 4) * cx0 * cx0 + Math.Pow(vy1, 4) * cR * cR - 2 * Math.Pow(vy1, 3) * vx2 * cx0 * cy0 - 2 * cx0 * vx1 * Math.Pow(vy2, 3) * cy0 + 2 * Math.Pow(vy1, 3) * vx1 * cx0 * cy0 - 4 * cy0 * vy2 * vy2 * vy1 * vx1 * vx1 - 4 * cy0 * vy2 * vy1 * vy1 * vx2 * vx2 + 2 * vy2 * vx1 * vx1 * vy1 * vy1 * cy0 - 2 * Math.Pow(vy1, 3) * cy0 * vx2 * vx1 + 2 * vy1 * vx2 * vx2 * vy2 * vy2 * cy0 - 2 * Math.Pow(vy2, 3) * cy0 * vx1 * vx2 + 2 * Math.Pow(vy2, 3) * cy0 * cx0 * vx2 + 2 * vx2 * vx1 * cy0 * cy0 * vy2 * vy2 + 2 * vx2 * vx1 * cy0 * cy0 * vy1 * vy1 - 2 * vx2 * vx1 * cR * cR * vy2 * vy2 - 2 * vx2 * vx1 * cR * cR * vy1 * vy1 - 4 * vy2 * vy2 * vy1 * vy1 * vx1 * vx2 + 6 * vy2 * vy2 * vy1 * vy1 * cx0 * vx1 + 6 * vy2 * vy2 * vy1 * vy1 * cx0 * vx2 - 6 * Math.Pow(vy2, 3) * vy1 * cx0 * vx1 - 6 * vy2 * Math.Pow(vy1, 3) * cx0 * vx2 + 2 * vx2 * vx2 * cy0 * cy0 * vy2 * vy1 - 2 * vx2 * vx2 * cR * cR * vy2 * vy1 + 2 * vx1 * vx1 * cy0 * cy0 * vy2 * vy1 - 2 * vx1 * vx1 * cR * cR * vy2 * vy1 + 2 * Math.Pow(vy2, 3) * vx1 * vy1 * vx2 - 2 * Math.Pow(vy2, 3) * cx0 * vy1 * vx2 + 2 * Math.Pow(vy1, 3) * vx1 * vy2 * vx2 - 2 * Math.Pow(vy1, 3) * cx0 * vx1 * vy2 + 2 * Math.Pow(vy1, 3) * cy0 * vx2 * vx2 - 6 * vy2 * vy2 * vy1 * vy1 * cx0 * cx0 + 6 * vy2 * vy2 * vy1 * vy1 * cR * cR + 2 * Math.Pow(vy2, 3) * vy1 * vx1 * vx1 + 2 * vy2 * Math.Pow(vy1, 3) * vx2 * vx2 + 4 * Math.Pow(vy2, 3) * vy1 * cx0 * cx0 + 4 * vy2 * Math.Pow(vy1, 3) * cx0 * cx0 - 4 * Math.Pow(vy2, 3) * vy1 * cR * cR - 4 * vy2 * Math.Pow(vy1, 3) * cR * cR - vx2 * vx2 * cy0 * cy0 * vy2 * vy2 - vx2 * vx2 * cy0 * cy0 * vy1 * vy1 + vx2 * vx2 * cR * cR * vy2 * vy2 + vx2 * vx2 * cR * cR * vy1 * vy1 - vx1 * vx1 * cy0 * cy0 * vy2 * vy2 - vx1 * vx1 * cy0 * cy0 * vy1 * vy1 + vx1 * vx1 * cR * cR * vy2 * vy2 + vx1 * vx1 * cR * cR * vy1 * vy1 + 2 * Math.Pow(vy2, 4) * cx0 * vx1 - vy2 * vy2 * vy1 * vy1 * vx2 * vx2 + 2 * Math.Pow(vy1, 4) * cx0 * vx2 - vy1 * vy1 * vx1 * vx1 * vy2 * vy2))) / w1 * vx1 + (vy1 * vx2)) / w;
		//            crs[1].Y = (float)-((vy1 * vx2 * cx0) + (cx0 * vx1 * vy2) - (vy1 * vx1 * cx0) + (2 * cy0 * vy2 * vy1) - (vy2 * vx1 * vx1) - (vy1 * vy1 * cy0) - (vy1 * vx2 * vx2) + (vx2 * vy1 * vx1) - (vy2 * vy2 * cy0) + (vx1 * vy2 * vx2) - (cx0 * vx2 * vy2) + Math.Sqrt((6 * vy1 * vy1 * vx2 * cx0 * cy0 * vy2 - 6 * vy1 * vx2 * cx0 * vy2 * vy2 * cy0 + 6 * cx0 * vx1 * vy2 * vy2 * cy0 * vy1 - 6 * cx0 * vx1 * vy2 * vy1 * vy1 * cy0 + 2 * cy0 * vy2 * vy1 * vy1 * vx2 * vx1 + 2 * cy0 * vy2 * vy2 * vy1 * vx1 * vx2 - 4 * vx2 * vx1 * cy0 * cy0 * vy2 * vy1 + 4 * vx2 * vx1 * cR * cR * vy2 * vy1 + 2 * Math.Pow(vy2, 3) * vx1 * vx1 * cy0 - Math.Pow(vy2, 4) * vx1 * vx1 - Math.Pow(vy2, 4) * cx0 * cx0 + Math.Pow(vy2, 4) * cR * cR - Math.Pow(vy1, 4) * vx2 * vx2 - Math.Pow(vy1, 4) * cx0 * cx0 + Math.Pow(vy1, 4) * cR * cR - 2 * Math.Pow(vy1, 3) * vx2 * cx0 * cy0 - 2 * cx0 * vx1 * Math.Pow(vy2, 3) * cy0 + 2 * Math.Pow(vy1, 3) * vx1 * cx0 * cy0 - 4 * cy0 * vy2 * vy2 * vy1 * vx1 * vx1 - 4 * cy0 * vy2 * vy1 * vy1 * vx2 * vx2 + 2 * vy2 * vx1 * vx1 * vy1 * vy1 * cy0 - 2 * Math.Pow(vy1, 3) * cy0 * vx2 * vx1 + 2 * vy1 * vx2 * vx2 * vy2 * vy2 * cy0 - 2 * Math.Pow(vy2, 3) * cy0 * vx1 * vx2 + 2 * Math.Pow(vy2, 3) * cy0 * cx0 * vx2 + 2 * vx2 * vx1 * cy0 * cy0 * vy2 * vy2 + 2 * vx2 * vx1 * cy0 * cy0 * vy1 * vy1 - 2 * vx2 * vx1 * cR * cR * vy2 * vy2 - 2 * vx2 * vx1 * cR * cR * vy1 * vy1 - 4 * vy2 * vy2 * vy1 * vy1 * vx1 * vx2 + 6 * vy2 * vy2 * vy1 * vy1 * cx0 * vx1 + 6 * vy2 * vy2 * vy1 * vy1 * cx0 * vx2 - 6 * Math.Pow(vy2, 3) * vy1 * cx0 * vx1 - 6 * vy2 * Math.Pow(vy1, 3) * cx0 * vx2 + 2 * vx2 * vx2 * cy0 * cy0 * vy2 * vy1 - 2 * vx2 * vx2 * cR * cR * vy2 * vy1 + 2 * vx1 * vx1 * cy0 * cy0 * vy2 * vy1 - 2 * vx1 * vx1 * cR * cR * vy2 * vy1 + 2 * Math.Pow(vy2, 3) * vx1 * vy1 * vx2 - 2 * Math.Pow(vy2, 3) * cx0 * vy1 * vx2 + 2 * Math.Pow(vy1, 3) * vx1 * vy2 * vx2 - 2 * Math.Pow(vy1, 3) * cx0 * vx1 * vy2 + 2 * Math.Pow(vy1, 3) * cy0 * vx2 * vx2 - 6 * vy2 * vy2 * vy1 * vy1 * cx0 * cx0 + 6 * vy2 * vy2 * vy1 * vy1 * cR * cR + 2 * Math.Pow(vy2, 3) * vy1 * vx1 * vx1 + 2 * vy2 * Math.Pow(vy1, 3) * vx2 * vx2 + 4 * Math.Pow(vy2, 3) * vy1 * cx0 * cx0 + 4 * vy2 * Math.Pow(vy1, 3) * cx0 * cx0 - 4 * Math.Pow(vy2, 3) * vy1 * cR * cR - 4 * vy2 * Math.Pow(vy1, 3) * cR * cR - vx2 * vx2 * cy0 * cy0 * vy2 * vy2 - vx2 * vx2 * cy0 * cy0 * vy1 * vy1 + vx2 * vx2 * cR * cR * vy2 * vy2 + vx2 * vx2 * cR * cR * vy1 * vy1 - vx1 * vx1 * cy0 * cy0 * vy2 * vy2 - vx1 * vx1 * cy0 * cy0 * vy1 * vy1 + vx1 * vx1 * cR * cR * vy2 * vy2 + vx1 * vx1 * cR * cR * vy1 * vy1 + 2 * Math.Pow(vy2, 4) * cx0 * vx1 - vy2 * vy2 * vy1 * vy1 * vx2 * vx2 + 2 * Math.Pow(vy1, 4) * cx0 * vx2 - vy1 * vy1 * vx1 * vx1 * vy2 * vy2))) / w1;
		//        }
		//        else
		//        {
		//            var sq = (float)Math.Sqrt(2 * vy1 * cy0 - cy0 * cy0 - vy1 * vy1 + cR * cR);
		//            crs[0].X = cx0 + sq;
		//            crs[0].Y = vy1;
		//            crs[1].X = cx0 - sq;
		//            crs[1].Y = vy1;
		//        }
		//        // Проверка принадлежности точки отрезку
		//        if (!float.IsNaN(crs[0].X) && !JointPointWithVector(crs[0].X, crs[0].Y, vx1, vy1, vx2, vy2))
		//            crs[0] = new PointF(float.NaN, float.NaN);
		//        if (!float.IsNaN(crs[1].X) && !JointPointWithVector(crs[1].X, crs[1].Y, vx1, vy1, vx2, vy2))
		//            crs[1] = new PointF(float.NaN, float.NaN);

		//        crs = crs
		//            // не пустая точка
		//            .Where(s => !s.X.isNaN() && !s.Y.isNaN())
		//            // Проверка принадлежности точки отрезку
		//            .Where(s => JointPointWithVector(s.X, s.Y, vx1, vy1, vx2, vy2))
		//            // Уникальность
		//            .Distinct()
		//            .ToArray();
		//    }
		//    return crs.Length > 0;
		//}

		///// <summary>
		///// Нахождение точек пересечения эллипса и отрезка
		///// </summary>
		///// <param name="cx0">X-координата центра эллипса</param>
		///// <param name="cy0">Y-координата центра эллипса</param>
		///// <param name="cxR">X-радиус</param>
		///// <param name="cyR">Y-радиус</param>
		///// <param name="vx1">X-координата первой точки отрезка</param>
		///// <param name="vy1">Y-координата первой точки отрезка</param>
		///// <param name="vx2">X-координата второй точки отрезка</param>
		///// <param name="vy2">Y-координата второй точки отрезка</param>
		///// <param name="crs">Массив с уникальными точками пересечения</param>
		///// <returns>Пересекаются или нет</returns>
		//public static bool JointEllipseWithVector(float cx0, float cy0, float cxR, float cyR, float vx1, float vy1, float vx2, float vy2, out PointF[] ocrs)
		//{
		//    ocrs = new PointF[2];
		//    var crs = new double[4];
		//    var w = vy1 - vy2;
		//    if (w != 0)
		//    {
		//        // Формула нахождения координат получена с помощью Maple 13 (система уравнений, преобразование к языку java)
		//        var fl = new double[] { 
		//         /*fl[0]*/   (vx1 * vy2),
		//         /*fl[1]*/   (cyR * cyR * cx0 * vx2 * vy1),
		//         /*fl[2]*/   (2 * cxR * cxR * cy0 * vy2 * vy1),
		//         /*fl[3]*/   (cyR * cyR * vx1 * vy2 * vx2),
		//         /*fl[4]*/   (cyR * cyR * vx1 * vy1 * vx2),
		//         /*fl[5]*/   (cyR * cyR * vx1 * vx1 * vy2),
		//         /*fl[6]*/   (vy1 * vy1 * cy0 * cxR * cxR),
		//         /*fl[7]*/   (cyR * cyR * vx2 * vx2 * vy1),
		//         /*fl[8]*/   (cyR * cyR * cx0 * vx1 * vy2),
		//         /*fl[9]*/   (vy2 * vy2 * cy0 * cxR * cxR),
		//         /*fl[10]*/   (cyR * cyR * cx0 * vx2 * vy2),
		//         /*fl[11]*/   0,
		//         /*fl[12]*/   (-2 * cyR * cyR * vx2 * vx1 - 2 * cxR * cxR * vy2 * vy1 + cyR * cyR * vx2 * vx2 + cyR * cyR * vx1 * vx1 + cxR * cxR * vy2 * vy2 + cxR * cxR * vy1 * vy1),
		//         /*fl[13]*/   (cyR * cyR * cx0 * vx1 * vy1),
		//         /*fl[14]*/   (vy1 * vx2),
		//         /*fl[15]*/   (vy1 * vy1),
		//         /*fl[16]*/   Math.Pow(cxR, 2),
		//         /*fl[17]*/   Math.Pow(cxR, 4),
		//         /*fl[18]*/   Math.Pow(cyR, 2),
		//         /*fl[19]*/   Math.Pow(cyR, 4)
		//        };
		//        //fl[11] = (float)Math.Sqrt((-2 * fl[1] * fl[6] + 2 * fl[13] * fl[6] - 2 * fl[2] * fl[5] - 2 * fl[2] * fl[7] - 2 * fl[3] * fl[9] - 2 * fl[4] * fl[6] + 2 * fl[5] * fl[6] + 2 * fl[7] * fl[9] - 2 * fl[8] * fl[9] + 2 * fl[9] * fl[10] + fl[17] * vy2 * vy2 * vy2 * vy2 * fl[18] + fl[17] * vy1 * vy1 * vy1 * vy1 * fl[18] + 2 * fl[5] * fl[9] + 2 * fl[6] * fl[7] - 2 * fl[3] * fl[18] * fl[16] * vy2 - 2 * fl[4] * fl[18] * fl[16] * vy1 - 6 * fl[16] * vy2 * vy2 * vy1 * vy1 * fl[18] * cx0 * cx0 + 2 * fl[16] * vy2 * vy2 * vy1 * fl[5] + 2 * fl[16] * vy2 * vy1 * vy1 * fl[7] + 4 * fl[16] * vy2 * vy2 * vy2 * vy1 * fl[18] * cx0 * cx0 + 4 * fl[16] * vy2 * vy1 * vy1 * vy1 * fl[18] * cx0 * cx0 - 2 * fl[7] * fl[18] * fl[16] * vy2 - fl[18] * vx2 * vx2 * fl[9] * cy0 - fl[18] * vx2 * vx2 * fl[6] * cy0 - 2 * fl[18] * fl[5] * fl[16] * vy1 - fl[5] * fl[16] * cy0 * cy0 * vy2 - fl[18] * vx1 * vx1 * fl[6] * cy0 + 2 * fl[16] * vy2 * vy2 * vy2 * fl[8] - fl[16] * vy2 * vy2 * fl[7] * vy1 + 2 * fl[16] * vy1 * vy1 * vy1 * fl[1] - fl[16] * vy1 * vy1 * fl[5] * vy2 + 6 * fl[17] * vy2 * vy2 * vy1 * vy1 * fl[18] - 4 * fl[17] * vy2 * vy2 * vy2 * vy1 * fl[18] - 4 * fl[17] * vy2 * vy1 * vy1 * vy1 * fl[18] + fl[19] * vx2 * vx2 * fl[16] * vy2 * vy2 + fl[7] * fl[18] * fl[16] * vy1 + fl[5] * fl[18] * fl[16] * vy2 + fl[19] * vx1 * vx1 * fl[16] * vy1 * vy1 - fl[16] * vy2 * vy2 * vy2 * fl[5] - fl[16] * vy2 * vy2 * vy2 * vy2 * fl[18] * cx0 * cx0 - fl[16] * vy1 * vy1 * vy1 * fl[7] - fl[16] * vy1 * vy1 * vy1 * vy1 * fl[18] * cx0 * cx0 + 6 * fl[1] * vy1 * fl[16] * cy0 * vy2 - 6 * fl[1] * fl[9] - 3 * fl[13] * fl[2] + 6 * fl[13] * fl[9] + fl[2] * fl[3] + fl[2] * fl[4] - 2 * fl[2] * fl[18] * vx2 * vx1 * cy0 + 4 * fl[3] * fl[18] * fl[16] * vy1 + 2 * fl[3] * fl[16] * cy0 * cy0 * vy2 + 2 * fl[4] * fl[16] * cy0 * cy0 * vy1 - 6 * fl[16] * vy2 * vy2 * vy1 * fl[8] - 6 * fl[16] * vy2 * vy1 * vy1 * fl[1] - 4 * fl[16] * vy2 * vy1 * vy1 * fl[3] + 6 * fl[16] * vy2 * vy1 * vy1 * fl[10] + 6 * fl[16] * vy2 * vy1 * vy1 * fl[8] + fl[18] * vx2 * vx2 * fl[2] * cy0 + fl[18] * vx1 * vx1 * fl[2] * cy0 + 2 * fl[16] * vy2 * vy2 * vy2 * fl[4] - 2 * fl[16] * vy2 * vy2 * vy2 * fl[1] + 2 * fl[16] * vy1 * vy1 * vy1 * fl[3] - 2 * fl[16] * vy1 * vy1 * vy1 * fl[8]));
		//        //fl[11] = (float)Math.Sqrt((-4 * cxR * cxR * cxR * cxR * Math.Pow(vy2, 3) * cyR * cyR * vy1 + 6 * cxR * cxR * cxR * cxR * vy2 * vy2 * cyR * cyR * vy1 * vy1 - cxR * cxR * vy2 * vy2 *vy2 *vy2 * cyR * cyR * cx0 * cx0 - cxR * cxR * vy2 * vy2 *vy2 *vy2 * cyR * cyR * vx1 * vx1 - 4 * vy1 * vy1 * vy1 * cxR * cxR * cxR * cxR * cyR * cyR * vy2 - vy1 * vy1 * vy1 * vy1 * cxR * cxR * cyR * cyR * cx0 * cx0 - vy1 * vy1 * vy1 * vy1 * cxR * cxR * cyR * cyR * vx2 * vx2 + cyR * cyR * cyR * cyR * vx1 * vx1 * cxR * cxR * vy1 * vy1 + cyR * cyR * cyR * cyR * vx1 * vx1 * cxR * cxR * vy2 * vy2 + cyR * cyR * cyR * cyR * vx2 * vx2 * cxR * cxR * vy1 * vy1 + cyR * cyR * cyR * cyR * vx2 * vx2 * cxR * cxR * vy2 * vy2 + 6 * cxR * cxR * vy2 * vy2 * cyR * cyR * cx0 * vy1 * vy1 * vx2 - 6 * cxR * cxR * Math.Pow(vy2, 3) * cyR * cyR * cx0 * vx1 * vy1 + 2 * cxR * cxR * Math.Pow(vy2, 3) * cyR * cyR * vx1 * vy1 * vx2 - 2 * cxR * cxR * Math.Pow(vy2, 3) * cyR * cyR * cx0 * vy1 * vx2 + 6 * vy1 * vy1 * cxR * cxR * cyR * cyR * cx0 * vx1 * vy2 * vy2 - 2 * vy1 * vy1 * vy1 * cxR * cxR * cyR * cyR * cx0 * vx1 * vy2 + 2 * vy1 * vy1 * vy1 * cxR * cxR * cyR * cyR * vx1 * vy2 * vx2 - 6 * vy1 * vy1 * vy1 * cxR * cxR * cyR * cyR * cx0 * vx2 * vy2 + 2 * cyR * cyR * vx1 * vx1 * cxR * cxR * cy0 * cy0 * vy2 * vy1 + 4 * cyR * cyR * cyR * cyR * vx2 * vx1 * cxR * cxR * vy2 * vy1 + 2 * cyR * cyR * vx2 * vx1 * cxR * cxR * cy0 * cy0 * vy2 * vy2 + 2 * cyR * cyR * vx2 * vx1 * cxR * cxR * cy0 * cy0 * vy1 * vy1 - 4 * cxR * cxR * vy2 * vy2 * vy1 * vy1 * cyR * cyR * vx1 * vx2 + 2 * cyR * cyR * vx2 * vx2 * cxR * cxR * cy0 * cy0 * vy2 * vy1 - 6 * cyR * cyR * cx0 * vx2 * vy2 * vy2 * cxR * cxR * cy0 * vy1 - 6 * cyR * cyR * cx0 * vx1 * vy2 * vy1 * vy1 * cy0 * cxR * cxR + 6 * cyR * cyR * cx0 * vx1 * vy2 * vy2 * cxR * cxR * cy0 * vy1 + 2 * cyR * cyR * vx1 * vy2 * vx2 * vy1 * vy1 * cy0 * cxR * cxR + 2 * cyR * cyR * vx1 * vy2 * vy2 * vx2 * cxR * cxR * cy0 * vy1 + 6 * cyR * cyR * cx0 * vx2 * vy2 * vy1 * vy1 * cy0 * cxR * cxR - 4 * cyR * cyR * vx2 * vx1 * cxR * cxR * cy0 * cy0 * vy2 * vy1 - 2 * cyR * cyR * cyR * cyR * vx2 * vx1 * cxR * cxR * vy2 * vy2 + 2 * cxR * cxR * Math.Pow(vy2, 3) * vy1 * cyR * cyR * vx1 * vx1 + 2 * cxR * cxR * vy2 * vy1 * vy1 * vy1 * cyR * cyR * vx2 * vx2 - 2 * cyR * cyR * cyR * cyR * vx2 * vx2 * cxR * cxR * vy2 * vy1 - cyR * cyR * vx2 * vx2 * cxR * cxR * cy0 * cy0 * vy2 * vy2 - cyR * cyR * vx2 * vx2 * cxR * cxR * cy0 * cy0 * vy1 * vy1 + 2 * cyR * cyR * cx0 * vy1 * vy1 * vy1 * vx1 * cy0 * cxR * cxR - 4 * cxR * cxR * cy0 * vy2 * vy1 * vy1 * cyR * cyR * vx2 * vx2 - 2 * cyR * cyR * vx1 * vy1 * vy1 * vy1 * vx2 * cy0 * cxR * cxR - 2 * cyR * cyR * cx0 * vy1 * vy1 * vy1 * vx2 * cy0 * cxR * cxR + 2 * cyR * cyR * vx2 * vx2 * vy1 * vy2 * vy2 * cy0 * cxR * cxR - 2 * cyR * cyR * cx0 * vx1 * Math.Pow(vy2, 3) * cy0 * cxR * cxR + 2 * cyR * cyR * cx0 * vx2 * Math.Pow(vy2, 3) * cy0 * cxR * cxR - 4 * cyR * cyR * vx1 * vx1 * vy2 * vy2 * cxR * cxR * cy0 * vy1 + 2 * cyR * cyR * vx1 * vx1 * vy2 * vy1 * vy1 * cy0 * cxR * cxR - 2 * cyR * cyR * vx1 * Math.Pow(vy2, 3) * vx2 * cy0 * cxR * cxR + 2 * cyR * cyR * vx1 * vx1 * Math.Pow(vy2, 3) * cy0 * cxR * cxR + 2 * cyR * cyR * vx2 * vx2 * vy1 * vy1 * vy1 * cy0 * cxR * cxR + 4 * cxR * cxR * Math.Pow(vy2, 3) * cyR * cyR * cx0 * cx0 * vy1 + 2 * cxR * cxR * vy2 * vy2 *vy2 *vy2 * cyR * cyR * cx0 * vx1 - 6 * cxR * cxR * vy2 * vy2 * cyR * cyR * cx0 * cx0 * vy1 * vy1 - cxR * cxR * vy2 * vy2 * cyR * cyR * vy1 * vy1 * vx2 * vx2 + 4 * vy1 * vy1 * vy1 * cxR * cxR * cyR * cyR * cx0 * cx0 * vy2 + 2 * vy1 * vy1 * vy1 * vy1 * cxR * cxR * cyR * cyR * cx0 * vx2 - vy1 * vy1 * cxR * cxR * cyR * cyR * vx1 * vx1 * vy2 * vy2 - 2 * cyR * cyR * cyR * cyR * vx1 * vx1 * cxR * cxR * vy2 * vy1 - cyR * cyR * vx1 * vx1 * cxR * cxR * cy0 * cy0 * vy2 * vy2 - cyR * cyR * vx1 * vx1 * cxR * cxR * cy0 * cy0 * vy1 * vy1 - 2 * cyR * cyR * cyR * cyR * vx2 * vx1 * cxR * cxR * vy1 * vy1 + cxR * cxR * cxR * cxR * vy2 * vy2 *vy2 *vy2 * cyR * cyR + vy1 * vy1 * vy1 * vy1 * cxR * cxR * cxR * cxR * cyR * cyR));
		//        fl[11] = (-(vx1 * vy2) - (-(cyR * cyR * cx0 * vx1 * vy2) + (cyR * cyR * cx0 * vx2 * vy2) + (cyR * cyR * vx1 * vx1 * vy2) - (cyR * cyR * vx1 * vy2 * vx2) + (cyR * cyR * cx0 * vy1 * vx1) - (2 * cxR * cxR * cy0 * vy2 * vy1) - (cyR * cyR * vx1 * vy1 * vx2) - (cyR * cyR * cx0 * vy1 * vx2) + (cyR * cyR * vx2 * vx2 * vy1) + (vy2 * vy2 * cy0 * cxR * cxR) + (vy1 * vy1 * cy0 * cxR * cxR) + Math.Sqrt((-4 * (int)Math.Pow(cxR, 4) * (int)Math.Pow(vy2, 3) * cyR * cyR * vy1 + 6 * (int)Math.Pow(cxR, 4) * vy2 * vy2 * cyR * cyR * vy1 * vy1 - cxR * cxR * (int)Math.Pow(vy2, 4) * cyR * cyR * cx0 * cx0 - cxR * cxR * (int)Math.Pow(vy2, 4) * cyR * cyR * vx1 * vx1 - 4 * (int)Math.Pow(vy1, 3) * (int)Math.Pow(cxR, 4) * cyR * cyR * vy2 - (int)Math.Pow(vy1, 4) * cxR * cxR * cyR * cyR * cx0 * cx0 - (int)Math.Pow(vy1, 4) * cxR * cxR * cyR * cyR * vx2 * vx2 + (int)Math.Pow(cyR, 4) * vx1 * vx1 * cxR * cxR * vy1 * vy1 + (int)Math.Pow(cyR, 4) * vx1 * vx1 * cxR * cxR * vy2 * vy2 + (int)Math.Pow(cyR, 4) * vx2 * vx2 * cxR * cxR * vy1 * vy1 + (int)Math.Pow(cyR, 4) * vx2 * vx2 * cxR * cxR * vy2 * vy2 + 6 * cxR * cxR * vy2 * vy2 * cyR * cyR * cx0 * vy1 * vy1 * vx2 - 6 * cxR * cxR * (int)Math.Pow(vy2, 3) * cyR * cyR * cx0 * vx1 * vy1 + 2 * cxR * cxR * (int)Math.Pow(vy2, 3) * cyR * cyR * vx1 * vy1 * vx2 - 2 * cxR * cxR * (int)Math.Pow(vy2, 3) * cyR * cyR * cx0 * vy1 * vx2 + 6 * vy1 * vy1 * cxR * cxR * cyR * cyR * cx0 * vx1 * vy2 * vy2 - 2 * (int)Math.Pow(vy1, 3) * cxR * cxR * cyR * cyR * cx0 * vx1 * vy2 + 2 * (int)Math.Pow(vy1, 3) * cxR * cxR * cyR * cyR * vx1 * vy2 * vx2 - 6 * (int)Math.Pow(vy1, 3) * cxR * cxR * cyR * cyR * cx0 * vx2 * vy2 + 2 * cyR * cyR * vx1 * vx1 * cxR * cxR * cy0 * cy0 * vy2 * vy1 + 4 * (int)Math.Pow(cyR, 4) * vx2 * vx1 * cxR * cxR * vy2 * vy1 + 2 * cyR * cyR * vx2 * vx1 * cxR * cxR * cy0 * cy0 * vy2 * vy2 + 2 * cyR * cyR * vx2 * vx1 * cxR * cxR * cy0 * cy0 * vy1 * vy1 - 4 * cxR * cxR * vy2 * vy2 * vy1 * vy1 * cyR * cyR * vx1 * vx2 + 2 * cyR * cyR * vx2 * vx2 * cxR * cxR * cy0 * cy0 * vy2 * vy1 - 6 * cyR * cyR * cx0 * vx2 * vy2 * vy2 * cxR * cxR * cy0 * vy1 - 6 * cyR * cyR * cx0 * vx1 * vy2 * vy1 * vy1 * cy0 * cxR * cxR + 6 * cyR * cyR * cx0 * vx1 * vy2 * vy2 * cxR * cxR * cy0 * vy1 + 2 * cyR * cyR * vx1 * vy2 * vx2 * vy1 * vy1 * cy0 * cxR * cxR + 2 * cyR * cyR * vx1 * vy2 * vy2 * vx2 * cxR * cxR * cy0 * vy1 + 6 * cyR * cyR * cx0 * vx2 * vy2 * vy1 * vy1 * cy0 * cxR * cxR - 4 * cyR * cyR * vx2 * vx1 * cxR * cxR * cy0 * cy0 * vy2 * vy1 - 2 * (int)Math.Pow(cyR, 4) * vx2 * vx1 * cxR * cxR * vy2 * vy2 + 2 * cxR * cxR * (int)Math.Pow(vy2, 3) * vy1 * cyR * cyR * vx1 * vx1 + 2 * cxR * cxR * vy2 * (int)Math.Pow(vy1, 3) * cyR * cyR * vx2 * vx2 - 2 * (int)Math.Pow(cyR, 4) * vx2 * vx2 * cxR * cxR * vy2 * vy1 - cyR * cyR * vx2 * vx2 * cxR * cxR * cy0 * cy0 * vy2 * vy2 - cyR * cyR * vx2 * vx2 * cxR * cxR * cy0 * cy0 * vy1 * vy1 + 2 * cyR * cyR * cx0 * (int)Math.Pow(vy1, 3) * vx1 * cy0 * cxR * cxR - 4 * cxR * cxR * cy0 * vy2 * vy1 * vy1 * cyR * cyR * vx2 * vx2 - 2 * cyR * cyR * vx1 * (int)Math.Pow(vy1, 3) * vx2 * cy0 * cxR * cxR - 2 * cyR * cyR * cx0 * (int)Math.Pow(vy1, 3) * vx2 * cy0 * cxR * cxR + 2 * cyR * cyR * vx2 * vx2 * vy1 * vy2 * vy2 * cy0 * cxR * cxR - 2 * cyR * cyR * cx0 * vx1 * (int)Math.Pow(vy2, 3) * cy0 * cxR * cxR + 2 * cyR * cyR * cx0 * vx2 * (int)Math.Pow(vy2, 3) * cy0 * cxR * cxR - 4 * cyR * cyR * vx1 * vx1 * vy2 * vy2 * cxR * cxR * cy0 * vy1 + 2 * cyR * cyR * vx1 * vx1 * vy2 * vy1 * vy1 * cy0 * cxR * cxR - 2 * cyR * cyR * vx1 * (int)Math.Pow(vy2, 3) * vx2 * cy0 * cxR * cxR + 2 * cyR * cyR * vx1 * vx1 * (int)Math.Pow(vy2, 3) * cy0 * cxR * cxR + 2 * cyR * cyR * vx2 * vx2 * (int)Math.Pow(vy1, 3) * cy0 * cxR * cxR + 4 * cxR * cxR * (int)Math.Pow(vy2, 3) * cyR * cyR * cx0 * cx0 * vy1 + 2 * cxR * cxR * (int)Math.Pow(vy2, 4) * cyR * cyR * cx0 * vx1 - 6 * cxR * cxR * vy2 * vy2 * cyR * cyR * cx0 * cx0 * vy1 * vy1 - cxR * cxR * vy2 * vy2 * cyR * cyR * vy1 * vy1 * vx2 * vx2 + 4 * (int)Math.Pow(vy1, 3) * cxR * cxR * cyR * cyR * cx0 * cx0 * vy2 + 2 * (int)Math.Pow(vy1, 4) * cxR * cxR * cyR * cyR * cx0 * vx2 - vy1 * vy1 * cxR * cxR * cyR * cyR * vx1 * vx1 * vy2 * vy2 - 2 * (int)Math.Pow(cyR, 4) * vx1 * vx1 * cxR * cxR * vy2 * vy1 - cyR * cyR * vx1 * vx1 * cxR * cxR * cy0 * cy0 * vy2 * vy2 - cyR * cyR * vx1 * vx1 * cxR * cxR * cy0 * cy0 * vy1 * vy1 - 2 * (int)Math.Pow(cyR, 4) * vx2 * vx1 * cxR * cxR * vy1 * vy1 + (int)Math.Pow(cxR, 4) * (int)Math.Pow(vy2, 4) * cyR * cyR + (int)Math.Pow(vy1, 4) * (int)Math.Pow(cxR, 4) * cyR * cyR))) / (cxR * cxR * vy2 * vy2 + vy1 * vy1 * cxR * cxR + cyR * cyR * vx1 * vx1 - 2 * cyR * cyR * vx2 * vx1 - 2 * cxR * cxR * vy2 * vy1 + cyR * cyR * vx2 * vx2) * vx2 + (-(cyR * cyR * cx0 * vx1 * vy2) + (cyR * cyR * cx0 * vx2 * vy2) + (cyR * cyR * vx1 * vx1 * vy2) - (cyR * cyR * vx1 * vy2 * vx2) + (cyR * cyR * cx0 * vy1 * vx1) - (2 * cxR * cxR * cy0 * vy2 * vy1) - (cyR * cyR * vx1 * vy1 * vx2) - (cyR * cyR * cx0 * vy1 * vx2) + (cyR * cyR * vx2 * vx2 * vy1) + (vy2 * vy2 * cy0 * cxR * cxR) + (vy1 * vy1 * cy0 * cxR * cxR) + Math.Sqrt((-4 * (int)Math.Pow(cxR, 4) * (int)Math.Pow(vy2, 3) * cyR * cyR * vy1 + 6 * (int)Math.Pow(cxR, 4) * vy2 * vy2 * cyR * cyR * vy1 * vy1 - cxR * cxR * (int)Math.Pow(vy2, 4) * cyR * cyR * cx0 * cx0 - cxR * cxR * (int)Math.Pow(vy2, 4) * cyR * cyR * vx1 * vx1 - 4 * (int)Math.Pow(vy1, 3) * (int)Math.Pow(cxR, 4) * cyR * cyR * vy2 - (int)Math.Pow(vy1, 4) * cxR * cxR * cyR * cyR * cx0 * cx0 - (int)Math.Pow(vy1, 4) * cxR * cxR * cyR * cyR * vx2 * vx2 + (int)Math.Pow(cyR, 4) * vx1 * vx1 * cxR * cxR * vy1 * vy1 + (int)Math.Pow(cyR, 4) * vx1 * vx1 * cxR * cxR * vy2 * vy2 + (int)Math.Pow(cyR, 4) * vx2 * vx2 * cxR * cxR * vy1 * vy1 + (int)Math.Pow(cyR, 4) * vx2 * vx2 * cxR * cxR * vy2 * vy2 + 6 * cxR * cxR * vy2 * vy2 * cyR * cyR * cx0 * vy1 * vy1 * vx2 - 6 * cxR * cxR * (int)Math.Pow(vy2, 3) * cyR * cyR * cx0 * vx1 * vy1 + 2 * cxR * cxR * (int)Math.Pow(vy2, 3) * cyR * cyR * vx1 * vy1 * vx2 - 2 * cxR * cxR * (int)Math.Pow(vy2, 3) * cyR * cyR * cx0 * vy1 * vx2 + 6 * vy1 * vy1 * cxR * cxR * cyR * cyR * cx0 * vx1 * vy2 * vy2 - 2 * (int)Math.Pow(vy1, 3) * cxR * cxR * cyR * cyR * cx0 * vx1 * vy2 + 2 * (int)Math.Pow(vy1, 3) * cxR * cxR * cyR * cyR * vx1 * vy2 * vx2 - 6 * (int)Math.Pow(vy1, 3) * cxR * cxR * cyR * cyR * cx0 * vx2 * vy2 + 2 * cyR * cyR * vx1 * vx1 * cxR * cxR * cy0 * cy0 * vy2 * vy1 + 4 * (int)Math.Pow(cyR, 4) * vx2 * vx1 * cxR * cxR * vy2 * vy1 + 2 * cyR * cyR * vx2 * vx1 * cxR * cxR * cy0 * cy0 * vy2 * vy2 + 2 * cyR * cyR * vx2 * vx1 * cxR * cxR * cy0 * cy0 * vy1 * vy1 - 4 * cxR * cxR * vy2 * vy2 * vy1 * vy1 * cyR * cyR * vx1 * vx2 + 2 * cyR * cyR * vx2 * vx2 * cxR * cxR * cy0 * cy0 * vy2 * vy1 - 6 * cyR * cyR * cx0 * vx2 * vy2 * vy2 * cxR * cxR * cy0 * vy1 - 6 * cyR * cyR * cx0 * vx1 * vy2 * vy1 * vy1 * cy0 * cxR * cxR + 6 * cyR * cyR * cx0 * vx1 * vy2 * vy2 * cxR * cxR * cy0 * vy1 + 2 * cyR * cyR * vx1 * vy2 * vx2 * vy1 * vy1 * cy0 * cxR * cxR + 2 * cyR * cyR * vx1 * vy2 * vy2 * vx2 * cxR * cxR * cy0 * vy1 + 6 * cyR * cyR * cx0 * vx2 * vy2 * vy1 * vy1 * cy0 * cxR * cxR - 4 * cyR * cyR * vx2 * vx1 * cxR * cxR * cy0 * cy0 * vy2 * vy1 - 2 * (int)Math.Pow(cyR, 4) * vx2 * vx1 * cxR * cxR * vy2 * vy2 + 2 * cxR * cxR * (int)Math.Pow(vy2, 3) * vy1 * cyR * cyR * vx1 * vx1 + 2 * cxR * cxR * vy2 * (int)Math.Pow(vy1, 3) * cyR * cyR * vx2 * vx2 - 2 * (int)Math.Pow(cyR, 4) * vx2 * vx2 * cxR * cxR * vy2 * vy1 - cyR * cyR * vx2 * vx2 * cxR * cxR * cy0 * cy0 * vy2 * vy2 - cyR * cyR * vx2 * vx2 * cxR * cxR * cy0 * cy0 * vy1 * vy1 + 2 * cyR * cyR * cx0 * (int)Math.Pow(vy1, 3) * vx1 * cy0 * cxR * cxR - 4 * cxR * cxR * cy0 * vy2 * vy1 * vy1 * cyR * cyR * vx2 * vx2 - 2 * cyR * cyR * vx1 * (int)Math.Pow(vy1, 3) * vx2 * cy0 * cxR * cxR - 2 * cyR * cyR * cx0 * (int)Math.Pow(vy1, 3) * vx2 * cy0 * cxR * cxR + 2 * cyR * cyR * vx2 * vx2 * vy1 * vy2 * vy2 * cy0 * cxR * cxR - 2 * cyR * cyR * cx0 * vx1 * (int)Math.Pow(vy2, 3) * cy0 * cxR * cxR + 2 * cyR * cyR * cx0 * vx2 * (int)Math.Pow(vy2, 3) * cy0 * cxR * cxR - 4 * cyR * cyR * vx1 * vx1 * vy2 * vy2 * cxR * cxR * cy0 * vy1 + 2 * cyR * cyR * vx1 * vx1 * vy2 * vy1 * vy1 * cy0 * cxR * cxR - 2 * cyR * cyR * vx1 * (int)Math.Pow(vy2, 3) * vx2 * cy0 * cxR * cxR + 2 * cyR * cyR * vx1 * vx1 * (int)Math.Pow(vy2, 3) * cy0 * cxR * cxR + 2 * cyR * cyR * vx2 * vx2 * (int)Math.Pow(vy1, 3) * cy0 * cxR * cxR + 4 * cxR * cxR * (int)Math.Pow(vy2, 3) * cyR * cyR * cx0 * cx0 * vy1 + 2 * cxR * cxR * (int)Math.Pow(vy2, 4) * cyR * cyR * cx0 * vx1 - 6 * cxR * cxR * vy2 * vy2 * cyR * cyR * cx0 * cx0 * vy1 * vy1 - cxR * cxR * vy2 * vy2 * cyR * cyR * vy1 * vy1 * vx2 * vx2 + 4 * (int)Math.Pow(vy1, 3) * cxR * cxR * cyR * cyR * cx0 * cx0 * vy2 + 2 * (int)Math.Pow(vy1, 4) * cxR * cxR * cyR * cyR * cx0 * vx2 - vy1 * vy1 * cxR * cxR * cyR * cyR * vx1 * vx1 * vy2 * vy2 - 2 * (int)Math.Pow(cyR, 4) * vx1 * vx1 * cxR * cxR * vy2 * vy1 - cyR * cyR * vx1 * vx1 * cxR * cxR * cy0 * cy0 * vy2 * vy2 - cyR * cyR * vx1 * vx1 * cxR * cxR * cy0 * cy0 * vy1 * vy1 - 2 * (int)Math.Pow(cyR, 4) * vx2 * vx1 * cxR * cxR * vy1 * vy1 + (int)Math.Pow(cxR, 4) * (int)Math.Pow(vy2, 4) * cyR * cyR + (int)Math.Pow(vy1, 4) * (int)Math.Pow(cxR, 4) * cyR * cyR))) / (cxR * cxR * vy2 * vy2 + vy1 * vy1 * cxR * cxR + cyR * cyR * vx1 * vx1 - 2 * cyR * cyR * vx2 * vx1 - 2 * cxR * cxR * vy2 * vy1 + cyR * cyR * vx2 * vx2) * vx1 + (vy1 * vx2)) / (-vy2 + vy1);


		//        //crs[0].X = (-fl[0] - (-fl[1] + fl[13] - fl[2] - fl[3] - fl[4] + fl[5] + fl[6] + fl[7] - fl[8] + fl[9] + fl[10] + fl[11]) / fl[12] * vx2 + (-fl[1] + fl[13] - fl[2] - fl[3] - fl[4] + fl[5] + fl[6] + fl[7] - fl[8] + fl[9] + fl[10] + fl[11]) / fl[12] * vx1 + fl[14]) / (w);
		//        //crs[0].Y = (-fl[1] + fl[13] - fl[2] - fl[3] - fl[4] + fl[5] + fl[6] + fl[7] - fl[8] + fl[9] + fl[10] + fl[11]) / fl[12];
		//        //crs[1].X = (-fl[0] + (fl[1] - fl[13] + fl[2] + fl[3] + fl[4] - fl[5] - fl[6] - fl[7] + fl[8] - fl[9] - fl[10] + fl[11]) / fl[12] * vx2 - (fl[1] - fl[13] + fl[2] + fl[3] + fl[4] - fl[5] - fl[6] - fl[7] + fl[8] - fl[9] - fl[10] + fl[11]) / fl[12] * vx1 + fl[14]) / (w);
		//        //crs[1].Y = -(fl[1] - fl[13] + fl[2] + fl[3] + fl[4] - fl[5] - fl[6] - fl[7] + fl[8] - fl[9] - fl[10] + fl[11]) / fl[12];

		//        crs[0] = (-(vx1 * vy2) - (-(cyR * cyR * cx0 * vx2 * vy1) + (cyR * cyR * cx0 * vx1 * vy1) - (2 * cxR * cxR * cy0 * vy2 * vy1) - (cyR * cyR * vx1 * vy2 * vx2) - (cyR * cyR * vx1 * vy1 * vx2) + (cyR * cyR * vx1 * vx1 * vy2) + (vy1 * vy1 * cy0 * cxR * cxR) + (cyR * cyR * vx2 * vx2 * vy1) - (cyR * cyR * cx0 * vx1 * vy2) + (vy2 * vy2 * cy0 * cxR * cxR) + (cyR * cyR * cx0 * vx2 * vy2) + Math.Sqrt((-2 * cyR * cyR * cx0 * vx2 * Math.Pow(vy1, 3) * cy0 * cxR * cxR + 2 * cyR * cyR * cx0 * vx1 * Math.Pow(vy1, 3) * cy0 * cxR * cxR - 4 * cxR * cxR * cy0 * vy2 * vy2 * vy1 * cyR * cyR * vx1 * vx1 - 4 * cxR * cxR * cy0 * vy2 * vy1 * vy1 * cyR * cyR * vx2 * vx2 - 2 * cyR * cyR * vx1 * Math.Pow(vy2, 3) * vx2 * cy0 * cxR * cxR - 2 * cyR * cyR * vx1 * Math.Pow(vy1, 3) * vx2 * cy0 * cxR * cxR + 2 * cyR * cyR * vx1 * vx1 * vy2 * vy1 * vy1 * cy0 * cxR * cxR + 2 * cyR * cyR * vx2 * vx2 * vy1 * vy2 * vy2 * cy0 * cxR * cxR - 2 * cyR * cyR * cx0 * vx1 * Math.Pow(vy2, 3) * cy0 * cxR * cxR + 2 * Math.Pow(vy2, 3) * cy0 * cxR * cxR * cyR * cyR * cx0 * vx2 + Math.Pow(cxR, 4) * Math.Pow(vy2, 4) * cyR * cyR + Math.Pow(cxR, 4) * Math.Pow(vy1, 4) * cyR * cyR + 2 * cyR * cyR * vx1 * vx1 * Math.Pow(vy2, 3) * cy0 * cxR * cxR + 2 * Math.Pow(vy1, 3) * cy0 * cxR * cxR * cyR * cyR * vx2 * vx2 - 2 * Math.Pow(cyR, 4) * vx2 * vx1 * cxR * cxR * vy2 * vy2 - 2 * Math.Pow(cyR, 4) * vx2 * vx1 * cxR * cxR * vy1 * vy1 - 6 * cxR * cxR * vy2 * vy2 * vy1 * vy1 * cyR * cyR * cx0 * cx0 + 2 * cxR * cxR * Math.Pow(vy2, 3) * vy1 * cyR * cyR * vx1 * vx1 + 2 * cxR * cxR * vy2 * Math.Pow(vy1, 3) * cyR * cyR * vx2 * vx2 + 4 * cxR * cxR * Math.Pow(vy2, 3) * vy1 * cyR * cyR * cx0 * cx0 + 4 * cxR * cxR * vy2 * Math.Pow(vy1, 3) * cyR * cyR * cx0 * cx0 - 2 * Math.Pow(cyR, 4) * vx2 * vx2 * cxR * cxR * vy2 * vy1 - cyR * cyR * vx2 * vx2 * cxR * cxR * cy0 * cy0 * vy2 * vy2 - cyR * cyR * vx2 * vx2 * cxR * cxR * cy0 * cy0 * vy1 * vy1 - 2 * Math.Pow(cyR, 4) * vx1 * vx1 * cxR * cxR * vy2 * vy1 - cyR * cyR * vx1 * vx1 * cxR * cxR * cy0 * cy0 * vy2 * vy2 - cyR * cyR * vx1 * vx1 * cxR * cxR * cy0 * cy0 * vy1 * vy1 + 2 * cxR * cxR * Math.Pow(vy2, 4) * cyR * cyR * cx0 * vx1 - cxR * cxR * vy2 * vy2 * cyR * cyR * vy1 * vy1 * vx2 * vx2 + 2 * cxR * cxR * Math.Pow(vy1, 4) * cyR * cyR * cx0 * vx2 - cxR * cxR * vy1 * vy1 * cyR * cyR * vx1 * vx1 * vy2 * vy2 + 6 * Math.Pow(cxR, 4) * vy2 * vy2 * vy1 * vy1 * cyR * cyR - 4 * Math.Pow(cxR, 4) * Math.Pow(vy2, 3) * vy1 * cyR * cyR - 4 * Math.Pow(cxR, 4) * vy2 * Math.Pow(vy1, 3) * cyR * cyR + Math.Pow(cyR, 4) * vx2 * vx2 * cxR * cxR * vy2 * vy2 + Math.Pow(cyR, 4) * vx2 * vx2 * cxR * cxR * vy1 * vy1 + Math.Pow(cyR, 4) * vx1 * vx1 * cxR * cxR * vy2 * vy2 + Math.Pow(cyR, 4) * vx1 * vx1 * cxR * cxR * vy1 * vy1 - cxR * cxR * Math.Pow(vy2, 4) * cyR * cyR * vx1 * vx1 - cxR * cxR * Math.Pow(vy2, 4) * cyR * cyR * cx0 * cx0 - cxR * cxR * Math.Pow(vy1, 4) * cyR * cyR * vx2 * vx2 - cxR * cxR * Math.Pow(vy1, 4) * cyR * cyR * cx0 * cx0 + 6 * cyR * cyR * cx0 * vx2 * vy1 * vy1 * cxR * cxR * cy0 * vy2 - 6 * cyR * cyR * cx0 * vx2 * vy1 * vy2 * vy2 * cy0 * cxR * cxR - 6 * cyR * cyR * cx0 * vx1 * vy1 * vy1 * cxR * cxR * cy0 * vy2 + 6 * cyR * cyR * cx0 * vx1 * vy1 * vy2 * vy2 * cy0 * cxR * cxR + 2 * cxR * cxR * cy0 * vy2 * vy2 * vy1 * cyR * cyR * vx1 * vx2 + 2 * cxR * cxR * cy0 * vy2 * vy1 * vy1 * cyR * cyR * vx1 * vx2 - 4 * cyR * cyR * vx2 * vx1 * cxR * cxR * cy0 * cy0 * vy2 * vy1 + 4 * Math.Pow(cyR, 4) * vx2 * vx1 * cxR * cxR * vy2 * vy1 + 2 * cyR * cyR * vx2 * vx1 * cxR * cxR * cy0 * cy0 * vy2 * vy2 + 2 * cyR * cyR * vx2 * vx1 * cxR * cxR * cy0 * cy0 * vy1 * vy1 - 6 * cxR * cxR * Math.Pow(vy2, 3) * vy1 * cyR * cyR * cx0 * vx1 - 6 * cxR * cxR * vy2 * Math.Pow(vy1, 3) * cyR * cyR * cx0 * vx2 - 4 * cxR * cxR * vy2 * vy2 * vy1 * vy1 * cyR * cyR * vx1 * vx2 + 6 * cxR * cxR * vy2 * vy2 * vy1 * vy1 * cyR * cyR * cx0 * vx2 + 6 * cxR * cxR * vy2 * vy2 * vy1 * vy1 * cyR * cyR * cx0 * vx1 + 2 * cyR * cyR * vx2 * vx2 * cxR * cxR * cy0 * cy0 * vy2 * vy1 + 2 * cyR * cyR * vx1 * vx1 * cxR * cxR * cy0 * cy0 * vy2 * vy1 + 2 * cxR * cxR * Math.Pow(vy2, 3) * cyR * cyR * vx1 * vy1 * vx2 - 2 * cxR * cxR * Math.Pow(vy2, 3) * cyR * cyR * cx0 * vy1 * vx2 + 2 * cxR * cxR * Math.Pow(vy1, 3) * cyR * cyR * vx1 * vy2 * vx2 - 2 * cxR * cxR * Math.Pow(vy1, 3) * cyR * cyR * cx0 * vx1 * vy2))) / (-2 * cyR * cyR * vx2 * vx1 - 2 * cxR * cxR * vy2 * vy1 + cyR * cyR * vx2 * vx2 + cyR * cyR * vx1 * vx1 + cxR * cxR * vy2 * vy2 + cxR * cxR * vy1 * vy1) * vx2 + (-(cyR * cyR * cx0 * vx2 * vy1) + (cyR * cyR * cx0 * vx1 * vy1) - (2 * cxR * cxR * cy0 * vy2 * vy1) - (cyR * cyR * vx1 * vy2 * vx2) - (cyR * cyR * vx1 * vy1 * vx2) + (cyR * cyR * vx1 * vx1 * vy2) + (vy1 * vy1 * cy0 * cxR * cxR) + (cyR * cyR * vx2 * vx2 * vy1) - (cyR * cyR * cx0 * vx1 * vy2) + (vy2 * vy2 * cy0 * cxR * cxR) + (cyR * cyR * cx0 * vx2 * vy2) + Math.Sqrt((-2 * cyR * cyR * cx0 * vx2 * Math.Pow(vy1, 3) * cy0 * cxR * cxR + 2 * cyR * cyR * cx0 * vx1 * Math.Pow(vy1, 3) * cy0 * cxR * cxR - 4 * cxR * cxR * cy0 * vy2 * vy2 * vy1 * cyR * cyR * vx1 * vx1 - 4 * cxR * cxR * cy0 * vy2 * vy1 * vy1 * cyR * cyR * vx2 * vx2 - 2 * cyR * cyR * vx1 * Math.Pow(vy2, 3) * vx2 * cy0 * cxR * cxR - 2 * cyR * cyR * vx1 * Math.Pow(vy1, 3) * vx2 * cy0 * cxR * cxR + 2 * cyR * cyR * vx1 * vx1 * vy2 * vy1 * vy1 * cy0 * cxR * cxR + 2 * cyR * cyR * vx2 * vx2 * vy1 * vy2 * vy2 * cy0 * cxR * cxR - 2 * cyR * cyR * cx0 * vx1 * Math.Pow(vy2, 3) * cy0 * cxR * cxR + 2 * Math.Pow(vy2, 3) * cy0 * cxR * cxR * cyR * cyR * cx0 * vx2 + Math.Pow(cxR, 4) * Math.Pow(vy2, 4) * cyR * cyR + Math.Pow(cxR, 4) * Math.Pow(vy1, 4) * cyR * cyR + 2 * cyR * cyR * vx1 * vx1 * Math.Pow(vy2, 3) * cy0 * cxR * cxR + 2 * Math.Pow(vy1, 3) * cy0 * cxR * cxR * cyR * cyR * vx2 * vx2 - 2 * Math.Pow(cyR, 4) * vx2 * vx1 * cxR * cxR * vy2 * vy2 - 2 * Math.Pow(cyR, 4) * vx2 * vx1 * cxR * cxR * vy1 * vy1 - 6 * cxR * cxR * vy2 * vy2 * vy1 * vy1 * cyR * cyR * cx0 * cx0 + 2 * cxR * cxR * Math.Pow(vy2, 3) * vy1 * cyR * cyR * vx1 * vx1 + 2 * cxR * cxR * vy2 * Math.Pow(vy1, 3) * cyR * cyR * vx2 * vx2 + 4 * cxR * cxR * Math.Pow(vy2, 3) * vy1 * cyR * cyR * cx0 * cx0 + 4 * cxR * cxR * vy2 * Math.Pow(vy1, 3) * cyR * cyR * cx0 * cx0 - 2 * Math.Pow(cyR, 4) * vx2 * vx2 * cxR * cxR * vy2 * vy1 - cyR * cyR * vx2 * vx2 * cxR * cxR * cy0 * cy0 * vy2 * vy2 - cyR * cyR * vx2 * vx2 * cxR * cxR * cy0 * cy0 * vy1 * vy1 - 2 * Math.Pow(cyR, 4) * vx1 * vx1 * cxR * cxR * vy2 * vy1 - cyR * cyR * vx1 * vx1 * cxR * cxR * cy0 * cy0 * vy2 * vy2 - cyR * cyR * vx1 * vx1 * cxR * cxR * cy0 * cy0 * vy1 * vy1 + 2 * cxR * cxR * Math.Pow(vy2, 4) * cyR * cyR * cx0 * vx1 - cxR * cxR * vy2 * vy2 * cyR * cyR * vy1 * vy1 * vx2 * vx2 + 2 * cxR * cxR * Math.Pow(vy1, 4) * cyR * cyR * cx0 * vx2 - cxR * cxR * vy1 * vy1 * cyR * cyR * vx1 * vx1 * vy2 * vy2 + 6 * Math.Pow(cxR, 4) * vy2 * vy2 * vy1 * vy1 * cyR * cyR - 4 * Math.Pow(cxR, 4) * Math.Pow(vy2, 3) * vy1 * cyR * cyR - 4 * Math.Pow(cxR, 4) * vy2 * Math.Pow(vy1, 3) * cyR * cyR + Math.Pow(cyR, 4) * vx2 * vx2 * cxR * cxR * vy2 * vy2 + Math.Pow(cyR, 4) * vx2 * vx2 * cxR * cxR * vy1 * vy1 + Math.Pow(cyR, 4) * vx1 * vx1 * cxR * cxR * vy2 * vy2 + Math.Pow(cyR, 4) * vx1 * vx1 * cxR * cxR * vy1 * vy1 - cxR * cxR * Math.Pow(vy2, 4) * cyR * cyR * vx1 * vx1 - cxR * cxR * Math.Pow(vy2, 4) * cyR * cyR * cx0 * cx0 - cxR * cxR * Math.Pow(vy1, 4) * cyR * cyR * vx2 * vx2 - cxR * cxR * Math.Pow(vy1, 4) * cyR * cyR * cx0 * cx0 + 6 * cyR * cyR * cx0 * vx2 * vy1 * vy1 * cxR * cxR * cy0 * vy2 - 6 * cyR * cyR * cx0 * vx2 * vy1 * vy2 * vy2 * cy0 * cxR * cxR - 6 * cyR * cyR * cx0 * vx1 * vy1 * vy1 * cxR * cxR * cy0 * vy2 + 6 * cyR * cyR * cx0 * vx1 * vy1 * vy2 * vy2 * cy0 * cxR * cxR + 2 * cxR * cxR * cy0 * vy2 * vy2 * vy1 * cyR * cyR * vx1 * vx2 + 2 * cxR * cxR * cy0 * vy2 * vy1 * vy1 * cyR * cyR * vx1 * vx2 - 4 * cyR * cyR * vx2 * vx1 * cxR * cxR * cy0 * cy0 * vy2 * vy1 + 4 * Math.Pow(cyR, 4) * vx2 * vx1 * cxR * cxR * vy2 * vy1 + 2 * cyR * cyR * vx2 * vx1 * cxR * cxR * cy0 * cy0 * vy2 * vy2 + 2 * cyR * cyR * vx2 * vx1 * cxR * cxR * cy0 * cy0 * vy1 * vy1 - 6 * cxR * cxR * Math.Pow(vy2, 3) * vy1 * cyR * cyR * cx0 * vx1 - 6 * cxR * cxR * vy2 * Math.Pow(vy1, 3) * cyR * cyR * cx0 * vx2 - 4 * cxR * cxR * vy2 * vy2 * vy1 * vy1 * cyR * cyR * vx1 * vx2 + 6 * cxR * cxR * vy2 * vy2 * vy1 * vy1 * cyR * cyR * cx0 * vx2 + 6 * cxR * cxR * vy2 * vy2 * vy1 * vy1 * cyR * cyR * cx0 * vx1 + 2 * cyR * cyR * vx2 * vx2 * cxR * cxR * cy0 * cy0 * vy2 * vy1 + 2 * cyR * cyR * vx1 * vx1 * cxR * cxR * cy0 * cy0 * vy2 * vy1 + 2 * cxR * cxR * Math.Pow(vy2, 3) * cyR * cyR * vx1 * vy1 * vx2 - 2 * cxR * cxR * Math.Pow(vy2, 3) * cyR * cyR * cx0 * vy1 * vx2 + 2 * cxR * cxR * Math.Pow(vy1, 3) * cyR * cyR * vx1 * vy2 * vx2 - 2 * cxR * cxR * Math.Pow(vy1, 3) * cyR * cyR * cx0 * vx1 * vy2))) / (-2 * cyR * cyR * vx2 * vx1 - 2 * cxR * cxR * vy2 * vy1 + cyR * cyR * vx2 * vx2 + cyR * cyR * vx1 * vx1 + cxR * cxR * vy2 * vy2 + cxR * cxR * vy1 * vy1) * vx1 + (vy1 * vx2)) / (w);
		//        crs[1] = (-(cyR * cyR * cx0 * vx2 * vy1) + (cyR * cyR * cx0 * vx1 * vy1) - (2 * cxR * cxR * cy0 * vy2 * vy1) - (cyR * cyR * vx1 * vy2 * vx2) - (cyR * cyR * vx1 * vy1 * vx2) + (cyR * cyR * vx1 * vx1 * vy2) + (vy1 * vy1 * cy0 * cxR * cxR) + (cyR * cyR * vx2 * vx2 * vy1) - (cyR * cyR * cx0 * vx1 * vy2) + (vy2 * vy2 * cy0 * cxR * cxR) + (cyR * cyR * cx0 * vx2 * vy2) + Math.Sqrt((-2 * cyR * cyR * cx0 * vx2 * Math.Pow(vy1, 3) * cy0 * cxR * cxR + 2 * cyR * cyR * cx0 * vx1 * Math.Pow(vy1, 3) * cy0 * cxR * cxR - 4 * cxR * cxR * cy0 * vy2 * vy2 * vy1 * cyR * cyR * vx1 * vx1 - 4 * cxR * cxR * cy0 * vy2 * vy1 * vy1 * cyR * cyR * vx2 * vx2 - 2 * cyR * cyR * vx1 * Math.Pow(vy2, 3) * vx2 * cy0 * cxR * cxR - 2 * cyR * cyR * vx1 * Math.Pow(vy1, 3) * vx2 * cy0 * cxR * cxR + 2 * cyR * cyR * vx1 * vx1 * vy2 * vy1 * vy1 * cy0 * cxR * cxR + 2 * cyR * cyR * vx2 * vx2 * vy1 * vy2 * vy2 * cy0 * cxR * cxR - 2 * cyR * cyR * cx0 * vx1 * Math.Pow(vy2, 3) * cy0 * cxR * cxR + 2 * Math.Pow(vy2, 3) * cy0 * cxR * cxR * cyR * cyR * cx0 * vx2 + Math.Pow(cxR, 4) * Math.Pow(vy2, 4) * cyR * cyR + Math.Pow(cxR, 4) * Math.Pow(vy1, 4) * cyR * cyR + 2 * cyR * cyR * vx1 * vx1 * Math.Pow(vy2, 3) * cy0 * cxR * cxR + 2 * Math.Pow(vy1, 3) * cy0 * cxR * cxR * cyR * cyR * vx2 * vx2 - 2 * Math.Pow(cyR, 4) * vx2 * vx1 * cxR * cxR * vy2 * vy2 - 2 * Math.Pow(cyR, 4) * vx2 * vx1 * cxR * cxR * vy1 * vy1 - 6 * cxR * cxR * vy2 * vy2 * vy1 * vy1 * cyR * cyR * cx0 * cx0 + 2 * cxR * cxR * Math.Pow(vy2, 3) * vy1 * cyR * cyR * vx1 * vx1 + 2 * cxR * cxR * vy2 * Math.Pow(vy1, 3) * cyR * cyR * vx2 * vx2 + 4 * cxR * cxR * Math.Pow(vy2, 3) * vy1 * cyR * cyR * cx0 * cx0 + 4 * cxR * cxR * vy2 * Math.Pow(vy1, 3) * cyR * cyR * cx0 * cx0 - 2 * Math.Pow(cyR, 4) * vx2 * vx2 * cxR * cxR * vy2 * vy1 - cyR * cyR * vx2 * vx2 * cxR * cxR * cy0 * cy0 * vy2 * vy2 - cyR * cyR * vx2 * vx2 * cxR * cxR * cy0 * cy0 * vy1 * vy1 - 2 * Math.Pow(cyR, 4) * vx1 * vx1 * cxR * cxR * vy2 * vy1 - cyR * cyR * vx1 * vx1 * cxR * cxR * cy0 * cy0 * vy2 * vy2 - cyR * cyR * vx1 * vx1 * cxR * cxR * cy0 * cy0 * vy1 * vy1 + 2 * cxR * cxR * Math.Pow(vy2, 4) * cyR * cyR * cx0 * vx1 - cxR * cxR * vy2 * vy2 * cyR * cyR * vy1 * vy1 * vx2 * vx2 + 2 * cxR * cxR * Math.Pow(vy1, 4) * cyR * cyR * cx0 * vx2 - cxR * cxR * vy1 * vy1 * cyR * cyR * vx1 * vx1 * vy2 * vy2 + 6 * Math.Pow(cxR, 4) * vy2 * vy2 * vy1 * vy1 * cyR * cyR - 4 * Math.Pow(cxR, 4) * Math.Pow(vy2, 3) * vy1 * cyR * cyR - 4 * Math.Pow(cxR, 4) * vy2 * Math.Pow(vy1, 3) * cyR * cyR + Math.Pow(cyR, 4) * vx2 * vx2 * cxR * cxR * vy2 * vy2 + Math.Pow(cyR, 4) * vx2 * vx2 * cxR * cxR * vy1 * vy1 + Math.Pow(cyR, 4) * vx1 * vx1 * cxR * cxR * vy2 * vy2 + Math.Pow(cyR, 4) * vx1 * vx1 * cxR * cxR * vy1 * vy1 - cxR * cxR * Math.Pow(vy2, 4) * cyR * cyR * vx1 * vx1 - cxR * cxR * Math.Pow(vy2, 4) * cyR * cyR * cx0 * cx0 - cxR * cxR * Math.Pow(vy1, 4) * cyR * cyR * vx2 * vx2 - cxR * cxR * Math.Pow(vy1, 4) * cyR * cyR * cx0 * cx0 + 6 * cyR * cyR * cx0 * vx2 * vy1 * vy1 * cxR * cxR * cy0 * vy2 - 6 * cyR * cyR * cx0 * vx2 * vy1 * vy2 * vy2 * cy0 * cxR * cxR - 6 * cyR * cyR * cx0 * vx1 * vy1 * vy1 * cxR * cxR * cy0 * vy2 + 6 * cyR * cyR * cx0 * vx1 * vy1 * vy2 * vy2 * cy0 * cxR * cxR + 2 * cxR * cxR * cy0 * vy2 * vy2 * vy1 * cyR * cyR * vx1 * vx2 + 2 * cxR * cxR * cy0 * vy2 * vy1 * vy1 * cyR * cyR * vx1 * vx2 - 4 * cyR * cyR * vx2 * vx1 * cxR * cxR * cy0 * cy0 * vy2 * vy1 + 4 * Math.Pow(cyR, 4) * vx2 * vx1 * cxR * cxR * vy2 * vy1 + 2 * cyR * cyR * vx2 * vx1 * cxR * cxR * cy0 * cy0 * vy2 * vy2 + 2 * cyR * cyR * vx2 * vx1 * cxR * cxR * cy0 * cy0 * vy1 * vy1 - 6 * cxR * cxR * Math.Pow(vy2, 3) * vy1 * cyR * cyR * cx0 * vx1 - 6 * cxR * cxR * vy2 * Math.Pow(vy1, 3) * cyR * cyR * cx0 * vx2 - 4 * cxR * cxR * vy2 * vy2 * vy1 * vy1 * cyR * cyR * vx1 * vx2 + 6 * cxR * cxR * vy2 * vy2 * vy1 * vy1 * cyR * cyR * cx0 * vx2 + 6 * cxR * cxR * vy2 * vy2 * vy1 * vy1 * cyR * cyR * cx0 * vx1 + 2 * cyR * cyR * vx2 * vx2 * cxR * cxR * cy0 * cy0 * vy2 * vy1 + 2 * cyR * cyR * vx1 * vx1 * cxR * cxR * cy0 * cy0 * vy2 * vy1 + 2 * cxR * cxR * Math.Pow(vy2, 3) * cyR * cyR * vx1 * vy1 * vx2 - 2 * cxR * cxR * Math.Pow(vy2, 3) * cyR * cyR * cx0 * vy1 * vx2 + 2 * cxR * cxR * Math.Pow(vy1, 3) * cyR * cyR * vx1 * vy2 * vx2 - 2 * cxR * cxR * Math.Pow(vy1, 3) * cyR * cyR * cx0 * vx1 * vy2))) / (-2 * cyR * cyR * vx2 * vx1 - 2 * cxR * cxR * vy2 * vy1 + cyR * cyR * vx2 * vx2 + cyR * cyR * vx1 * vx1 + cxR * cxR * vy2 * vy2 + cxR * cxR * vy1 * vy1);
		//        crs[2] = (-(vx1 * vy2) + ((cyR * cyR * cx0 * vx2 * vy1) - (cyR * cyR * cx0 * vx1 * vy1) + (2 * cxR * cxR * cy0 * vy2 * vy1) + (cyR * cyR * vx1 * vy2 * vx2) + (cyR * cyR * vx1 * vy1 * vx2) - (cyR * cyR * vx1 * vx1 * vy2) - (vy1 * vy1 * cy0 * cxR * cxR) - (cyR * cyR * vx2 * vx2 * vy1) + (cyR * cyR * cx0 * vx1 * vy2) - (vy2 * vy2 * cy0 * cxR * cxR) - (cyR * cyR * cx0 * vx2 * vy2) + Math.Sqrt((-2 * cyR * cyR * cx0 * vx2 * Math.Pow(vy1, 3) * cy0 * cxR * cxR + 2 * cyR * cyR * cx0 * vx1 * Math.Pow(vy1, 3) * cy0 * cxR * cxR - 4 * cxR * cxR * cy0 * vy2 * vy2 * vy1 * cyR * cyR * vx1 * vx1 - 4 * cxR * cxR * cy0 * vy2 * vy1 * vy1 * cyR * cyR * vx2 * vx2 - 2 * cyR * cyR * vx1 * Math.Pow(vy2, 3) * vx2 * cy0 * cxR * cxR - 2 * cyR * cyR * vx1 * Math.Pow(vy1, 3) * vx2 * cy0 * cxR * cxR + 2 * cyR * cyR * vx1 * vx1 * vy2 * vy1 * vy1 * cy0 * cxR * cxR + 2 * cyR * cyR * vx2 * vx2 * vy1 * vy2 * vy2 * cy0 * cxR * cxR - 2 * cyR * cyR * cx0 * vx1 * Math.Pow(vy2, 3) * cy0 * cxR * cxR + 2 * Math.Pow(vy2, 3) * cy0 * cxR * cxR * cyR * cyR * cx0 * vx2 + Math.Pow(cxR, 4) * Math.Pow(vy2, 4) * cyR * cyR + Math.Pow(cxR, 4) * Math.Pow(vy1, 4) * cyR * cyR + 2 * cyR * cyR * vx1 * vx1 * Math.Pow(vy2, 3) * cy0 * cxR * cxR + 2 * Math.Pow(vy1, 3) * cy0 * cxR * cxR * cyR * cyR * vx2 * vx2 - 2 * Math.Pow(cyR, 4) * vx2 * vx1 * cxR * cxR * vy2 * vy2 - 2 * Math.Pow(cyR, 4) * vx2 * vx1 * cxR * cxR * vy1 * vy1 - 6 * cxR * cxR * vy2 * vy2 * vy1 * vy1 * cyR * cyR * cx0 * cx0 + 2 * cxR * cxR * Math.Pow(vy2, 3) * vy1 * cyR * cyR * vx1 * vx1 + 2 * cxR * cxR * vy2 * Math.Pow(vy1, 3) * cyR * cyR * vx2 * vx2 + 4 * cxR * cxR * Math.Pow(vy2, 3) * vy1 * cyR * cyR * cx0 * cx0 + 4 * cxR * cxR * vy2 * Math.Pow(vy1, 3) * cyR * cyR * cx0 * cx0 - 2 * Math.Pow(cyR, 4) * vx2 * vx2 * cxR * cxR * vy2 * vy1 - cyR * cyR * vx2 * vx2 * cxR * cxR * cy0 * cy0 * vy2 * vy2 - cyR * cyR * vx2 * vx2 * cxR * cxR * cy0 * cy0 * vy1 * vy1 - 2 * Math.Pow(cyR, 4) * vx1 * vx1 * cxR * cxR * vy2 * vy1 - cyR * cyR * vx1 * vx1 * cxR * cxR * cy0 * cy0 * vy2 * vy2 - cyR * cyR * vx1 * vx1 * cxR * cxR * cy0 * cy0 * vy1 * vy1 + 2 * cxR * cxR * Math.Pow(vy2, 4) * cyR * cyR * cx0 * vx1 - cxR * cxR * vy2 * vy2 * cyR * cyR * vy1 * vy1 * vx2 * vx2 + 2 * cxR * cxR * Math.Pow(vy1, 4) * cyR * cyR * cx0 * vx2 - cxR * cxR * vy1 * vy1 * cyR * cyR * vx1 * vx1 * vy2 * vy2 + 6 * Math.Pow(cxR, 4) * vy2 * vy2 * vy1 * vy1 * cyR * cyR - 4 * Math.Pow(cxR, 4) * Math.Pow(vy2, 3) * vy1 * cyR * cyR - 4 * Math.Pow(cxR, 4) * vy2 * Math.Pow(vy1, 3) * cyR * cyR + Math.Pow(cyR, 4) * vx2 * vx2 * cxR * cxR * vy2 * vy2 + Math.Pow(cyR, 4) * vx2 * vx2 * cxR * cxR * vy1 * vy1 + Math.Pow(cyR, 4) * vx1 * vx1 * cxR * cxR * vy2 * vy2 + Math.Pow(cyR, 4) * vx1 * vx1 * cxR * cxR * vy1 * vy1 - cxR * cxR * Math.Pow(vy2, 4) * cyR * cyR * vx1 * vx1 - cxR * cxR * Math.Pow(vy2, 4) * cyR * cyR * cx0 * cx0 - cxR * cxR * Math.Pow(vy1, 4) * cyR * cyR * vx2 * vx2 - cxR * cxR * Math.Pow(vy1, 4) * cyR * cyR * cx0 * cx0 + 6 * cyR * cyR * cx0 * vx2 * vy1 * vy1 * cxR * cxR * cy0 * vy2 - 6 * cyR * cyR * cx0 * vx2 * vy1 * vy2 * vy2 * cy0 * cxR * cxR - 6 * cyR * cyR * cx0 * vx1 * vy1 * vy1 * cxR * cxR * cy0 * vy2 + 6 * cyR * cyR * cx0 * vx1 * vy1 * vy2 * vy2 * cy0 * cxR * cxR + 2 * cxR * cxR * cy0 * vy2 * vy2 * vy1 * cyR * cyR * vx1 * vx2 + 2 * cxR * cxR * cy0 * vy2 * vy1 * vy1 * cyR * cyR * vx1 * vx2 - 4 * cyR * cyR * vx2 * vx1 * cxR * cxR * cy0 * cy0 * vy2 * vy1 + 4 * Math.Pow(cyR, 4) * vx2 * vx1 * cxR * cxR * vy2 * vy1 + 2 * cyR * cyR * vx2 * vx1 * cxR * cxR * cy0 * cy0 * vy2 * vy2 + 2 * cyR * cyR * vx2 * vx1 * cxR * cxR * cy0 * cy0 * vy1 * vy1 - 6 * cxR * cxR * Math.Pow(vy2, 3) * vy1 * cyR * cyR * cx0 * vx1 - 6 * cxR * cxR * vy2 * Math.Pow(vy1, 3) * cyR * cyR * cx0 * vx2 - 4 * cxR * cxR * vy2 * vy2 * vy1 * vy1 * cyR * cyR * vx1 * vx2 + 6 * cxR * cxR * vy2 * vy2 * vy1 * vy1 * cyR * cyR * cx0 * vx2 + 6 * cxR * cxR * vy2 * vy2 * vy1 * vy1 * cyR * cyR * cx0 * vx1 + 2 * cyR * cyR * vx2 * vx2 * cxR * cxR * cy0 * cy0 * vy2 * vy1 + 2 * cyR * cyR * vx1 * vx1 * cxR * cxR * cy0 * cy0 * vy2 * vy1 + 2 * cxR * cxR * Math.Pow(vy2, 3) * cyR * cyR * vx1 * vy1 * vx2 - 2 * cxR * cxR * Math.Pow(vy2, 3) * cyR * cyR * cx0 * vy1 * vx2 + 2 * cxR * cxR * Math.Pow(vy1, 3) * cyR * cyR * vx1 * vy2 * vx2 - 2 * cxR * cxR * Math.Pow(vy1, 3) * cyR * cyR * cx0 * vx1 * vy2))) / (-2 * cyR * cyR * vx2 * vx1 - 2 * cxR * cxR * vy2 * vy1 + cyR * cyR * vx2 * vx2 + cyR * cyR * vx1 * vx1 + cxR * cxR * vy2 * vy2 + cxR * cxR * vy1 * vy1) * vx2 - ((cyR * cyR * cx0 * vx2 * vy1) - (cyR * cyR * cx0 * vx1 * vy1) + (2 * cxR * cxR * cy0 * vy2 * vy1) + (cyR * cyR * vx1 * vy2 * vx2) + (cyR * cyR * vx1 * vy1 * vx2) - (cyR * cyR * vx1 * vx1 * vy2) - (vy1 * vy1 * cy0 * cxR * cxR) - (cyR * cyR * vx2 * vx2 * vy1) + (cyR * cyR * cx0 * vx1 * vy2) - (vy2 * vy2 * cy0 * cxR * cxR) - (cyR * cyR * cx0 * vx2 * vy2) + Math.Sqrt((-2 * cyR * cyR * cx0 * vx2 * Math.Pow(vy1, 3) * cy0 * cxR * cxR + 2 * cyR * cyR * cx0 * vx1 * Math.Pow(vy1, 3) * cy0 * cxR * cxR - 4 * cxR * cxR * cy0 * vy2 * vy2 * vy1 * cyR * cyR * vx1 * vx1 - 4 * cxR * cxR * cy0 * vy2 * vy1 * vy1 * cyR * cyR * vx2 * vx2 - 2 * cyR * cyR * vx1 * Math.Pow(vy2, 3) * vx2 * cy0 * cxR * cxR - 2 * cyR * cyR * vx1 * Math.Pow(vy1, 3) * vx2 * cy0 * cxR * cxR + 2 * cyR * cyR * vx1 * vx1 * vy2 * vy1 * vy1 * cy0 * cxR * cxR + 2 * cyR * cyR * vx2 * vx2 * vy1 * vy2 * vy2 * cy0 * cxR * cxR - 2 * cyR * cyR * cx0 * vx1 * Math.Pow(vy2, 3) * cy0 * cxR * cxR + 2 * Math.Pow(vy2, 3) * cy0 * cxR * cxR * cyR * cyR * cx0 * vx2 + Math.Pow(cxR, 4) * Math.Pow(vy2, 4) * cyR * cyR + Math.Pow(cxR, 4) * Math.Pow(vy1, 4) * cyR * cyR + 2 * cyR * cyR * vx1 * vx1 * Math.Pow(vy2, 3) * cy0 * cxR * cxR + 2 * Math.Pow(vy1, 3) * cy0 * cxR * cxR * cyR * cyR * vx2 * vx2 - 2 * Math.Pow(cyR, 4) * vx2 * vx1 * cxR * cxR * vy2 * vy2 - 2 * Math.Pow(cyR, 4) * vx2 * vx1 * cxR * cxR * vy1 * vy1 - 6 * cxR * cxR * vy2 * vy2 * vy1 * vy1 * cyR * cyR * cx0 * cx0 + 2 * cxR * cxR * Math.Pow(vy2, 3) * vy1 * cyR * cyR * vx1 * vx1 + 2 * cxR * cxR * vy2 * Math.Pow(vy1, 3) * cyR * cyR * vx2 * vx2 + 4 * cxR * cxR * Math.Pow(vy2, 3) * vy1 * cyR * cyR * cx0 * cx0 + 4 * cxR * cxR * vy2 * Math.Pow(vy1, 3) * cyR * cyR * cx0 * cx0 - 2 * Math.Pow(cyR, 4) * vx2 * vx2 * cxR * cxR * vy2 * vy1 - cyR * cyR * vx2 * vx2 * cxR * cxR * cy0 * cy0 * vy2 * vy2 - cyR * cyR * vx2 * vx2 * cxR * cxR * cy0 * cy0 * vy1 * vy1 - 2 * Math.Pow(cyR, 4) * vx1 * vx1 * cxR * cxR * vy2 * vy1 - cyR * cyR * vx1 * vx1 * cxR * cxR * cy0 * cy0 * vy2 * vy2 - cyR * cyR * vx1 * vx1 * cxR * cxR * cy0 * cy0 * vy1 * vy1 + 2 * cxR * cxR * Math.Pow(vy2, 4) * cyR * cyR * cx0 * vx1 - cxR * cxR * vy2 * vy2 * cyR * cyR * vy1 * vy1 * vx2 * vx2 + 2 * cxR * cxR * Math.Pow(vy1, 4) * cyR * cyR * cx0 * vx2 - cxR * cxR * vy1 * vy1 * cyR * cyR * vx1 * vx1 * vy2 * vy2 + 6 * Math.Pow(cxR, 4) * vy2 * vy2 * vy1 * vy1 * cyR * cyR - 4 * Math.Pow(cxR, 4) * Math.Pow(vy2, 3) * vy1 * cyR * cyR - 4 * Math.Pow(cxR, 4) * vy2 * Math.Pow(vy1, 3) * cyR * cyR + Math.Pow(cyR, 4) * vx2 * vx2 * cxR * cxR * vy2 * vy2 + Math.Pow(cyR, 4) * vx2 * vx2 * cxR * cxR * vy1 * vy1 + Math.Pow(cyR, 4) * vx1 * vx1 * cxR * cxR * vy2 * vy2 + Math.Pow(cyR, 4) * vx1 * vx1 * cxR * cxR * vy1 * vy1 - cxR * cxR * Math.Pow(vy2, 4) * cyR * cyR * vx1 * vx1 - cxR * cxR * Math.Pow(vy2, 4) * cyR * cyR * cx0 * cx0 - cxR * cxR * Math.Pow(vy1, 4) * cyR * cyR * vx2 * vx2 - cxR * cxR * Math.Pow(vy1, 4) * cyR * cyR * cx0 * cx0 + 6 * cyR * cyR * cx0 * vx2 * vy1 * vy1 * cxR * cxR * cy0 * vy2 - 6 * cyR * cyR * cx0 * vx2 * vy1 * vy2 * vy2 * cy0 * cxR * cxR - 6 * cyR * cyR * cx0 * vx1 * vy1 * vy1 * cxR * cxR * cy0 * vy2 + 6 * cyR * cyR * cx0 * vx1 * vy1 * vy2 * vy2 * cy0 * cxR * cxR + 2 * cxR * cxR * cy0 * vy2 * vy2 * vy1 * cyR * cyR * vx1 * vx2 + 2 * cxR * cxR * cy0 * vy2 * vy1 * vy1 * cyR * cyR * vx1 * vx2 - 4 * cyR * cyR * vx2 * vx1 * cxR * cxR * cy0 * cy0 * vy2 * vy1 + 4 * Math.Pow(cyR, 4) * vx2 * vx1 * cxR * cxR * vy2 * vy1 + 2 * cyR * cyR * vx2 * vx1 * cxR * cxR * cy0 * cy0 * vy2 * vy2 + 2 * cyR * cyR * vx2 * vx1 * cxR * cxR * cy0 * cy0 * vy1 * vy1 - 6 * cxR * cxR * Math.Pow(vy2, 3) * vy1 * cyR * cyR * cx0 * vx1 - 6 * cxR * cxR * vy2 * Math.Pow(vy1, 3) * cyR * cyR * cx0 * vx2 - 4 * cxR * cxR * vy2 * vy2 * vy1 * vy1 * cyR * cyR * vx1 * vx2 + 6 * cxR * cxR * vy2 * vy2 * vy1 * vy1 * cyR * cyR * cx0 * vx2 + 6 * cxR * cxR * vy2 * vy2 * vy1 * vy1 * cyR * cyR * cx0 * vx1 + 2 * cyR * cyR * vx2 * vx2 * cxR * cxR * cy0 * cy0 * vy2 * vy1 + 2 * cyR * cyR * vx1 * vx1 * cxR * cxR * cy0 * cy0 * vy2 * vy1 + 2 * cxR * cxR * Math.Pow(vy2, 3) * cyR * cyR * vx1 * vy1 * vx2 - 2 * cxR * cxR * Math.Pow(vy2, 3) * cyR * cyR * cx0 * vy1 * vx2 + 2 * cxR * cxR * Math.Pow(vy1, 3) * cyR * cyR * vx1 * vy2 * vx2 - 2 * cxR * cxR * Math.Pow(vy1, 3) * cyR * cyR * cx0 * vx1 * vy2))) / (-2 * cyR * cyR * vx2 * vx1 - 2 * cxR * cxR * vy2 * vy1 + cyR * cyR * vx2 * vx2 + cyR * cyR * vx1 * vx1 + cxR * cxR * vy2 * vy2 + cxR * cxR * vy1 * vy1) * vx1 + (vy1 * vx2)) / (w);
		//        crs[3] = -((cyR * cyR * cx0 * vx2 * vy1) - (cyR * cyR * cx0 * vx1 * vy1) + (2 * cxR * cxR * cy0 * vy2 * vy1) + (cyR * cyR * vx1 * vy2 * vx2) + (cyR * cyR * vx1 * vy1 * vx2) - (cyR * cyR * vx1 * vx1 * vy2) - (vy1 * vy1 * cy0 * cxR * cxR) - (cyR * cyR * vx2 * vx2 * vy1) + (cyR * cyR * cx0 * vx1 * vy2) - (vy2 * vy2 * cy0 * cxR * cxR) - (cyR * cyR * cx0 * vx2 * vy2) + Math.Sqrt((-2 * cyR * cyR * cx0 * vx2 * Math.Pow(vy1, 3) * cy0 * cxR * cxR + 2 * cyR * cyR * cx0 * vx1 * Math.Pow(vy1, 3) * cy0 * cxR * cxR - 4 * cxR * cxR * cy0 * vy2 * vy2 * vy1 * cyR * cyR * vx1 * vx1 - 4 * cxR * cxR * cy0 * vy2 * vy1 * vy1 * cyR * cyR * vx2 * vx2 - 2 * cyR * cyR * vx1 * Math.Pow(vy2, 3) * vx2 * cy0 * cxR * cxR - 2 * cyR * cyR * vx1 * Math.Pow(vy1, 3) * vx2 * cy0 * cxR * cxR + 2 * cyR * cyR * vx1 * vx1 * vy2 * vy1 * vy1 * cy0 * cxR * cxR + 2 * cyR * cyR * vx2 * vx2 * vy1 * vy2 * vy2 * cy0 * cxR * cxR - 2 * cyR * cyR * cx0 * vx1 * Math.Pow(vy2, 3) * cy0 * cxR * cxR + 2 * Math.Pow(vy2, 3) * cy0 * cxR * cxR * cyR * cyR * cx0 * vx2 + Math.Pow(cxR, 4) * Math.Pow(vy2, 4) * cyR * cyR + Math.Pow(cxR, 4) * Math.Pow(vy1, 4) * cyR * cyR + 2 * cyR * cyR * vx1 * vx1 * Math.Pow(vy2, 3) * cy0 * cxR * cxR + 2 * Math.Pow(vy1, 3) * cy0 * cxR * cxR * cyR * cyR * vx2 * vx2 - 2 * Math.Pow(cyR, 4) * vx2 * vx1 * cxR * cxR * vy2 * vy2 - 2 * Math.Pow(cyR, 4) * vx2 * vx1 * cxR * cxR * vy1 * vy1 - 6 * cxR * cxR * vy2 * vy2 * vy1 * vy1 * cyR * cyR * cx0 * cx0 + 2 * cxR * cxR * Math.Pow(vy2, 3) * vy1 * cyR * cyR * vx1 * vx1 + 2 * cxR * cxR * vy2 * Math.Pow(vy1, 3) * cyR * cyR * vx2 * vx2 + 4 * cxR * cxR * Math.Pow(vy2, 3) * vy1 * cyR * cyR * cx0 * cx0 + 4 * cxR * cxR * vy2 * Math.Pow(vy1, 3) * cyR * cyR * cx0 * cx0 - 2 * Math.Pow(cyR, 4) * vx2 * vx2 * cxR * cxR * vy2 * vy1 - cyR * cyR * vx2 * vx2 * cxR * cxR * cy0 * cy0 * vy2 * vy2 - cyR * cyR * vx2 * vx2 * cxR * cxR * cy0 * cy0 * vy1 * vy1 - 2 * Math.Pow(cyR, 4) * vx1 * vx1 * cxR * cxR * vy2 * vy1 - cyR * cyR * vx1 * vx1 * cxR * cxR * cy0 * cy0 * vy2 * vy2 - cyR * cyR * vx1 * vx1 * cxR * cxR * cy0 * cy0 * vy1 * vy1 + 2 * cxR * cxR * Math.Pow(vy2, 4) * cyR * cyR * cx0 * vx1 - cxR * cxR * vy2 * vy2 * cyR * cyR * vy1 * vy1 * vx2 * vx2 + 2 * cxR * cxR * Math.Pow(vy1, 4) * cyR * cyR * cx0 * vx2 - cxR * cxR * vy1 * vy1 * cyR * cyR * vx1 * vx1 * vy2 * vy2 + 6 * Math.Pow(cxR, 4) * vy2 * vy2 * vy1 * vy1 * cyR * cyR - 4 * Math.Pow(cxR, 4) * Math.Pow(vy2, 3) * vy1 * cyR * cyR - 4 * Math.Pow(cxR, 4) * vy2 * Math.Pow(vy1, 3) * cyR * cyR + Math.Pow(cyR, 4) * vx2 * vx2 * cxR * cxR * vy2 * vy2 + Math.Pow(cyR, 4) * vx2 * vx2 * cxR * cxR * vy1 * vy1 + Math.Pow(cyR, 4) * vx1 * vx1 * cxR * cxR * vy2 * vy2 + Math.Pow(cyR, 4) * vx1 * vx1 * cxR * cxR * vy1 * vy1 - cxR * cxR * Math.Pow(vy2, 4) * cyR * cyR * vx1 * vx1 - cxR * cxR * Math.Pow(vy2, 4) * cyR * cyR * cx0 * cx0 - cxR * cxR * Math.Pow(vy1, 4) * cyR * cyR * vx2 * vx2 - cxR * cxR * Math.Pow(vy1, 4) * cyR * cyR * cx0 * cx0 + 6 * cyR * cyR * cx0 * vx2 * vy1 * vy1 * cxR * cxR * cy0 * vy2 - 6 * cyR * cyR * cx0 * vx2 * vy1 * vy2 * vy2 * cy0 * cxR * cxR - 6 * cyR * cyR * cx0 * vx1 * vy1 * vy1 * cxR * cxR * cy0 * vy2 + 6 * cyR * cyR * cx0 * vx1 * vy1 * vy2 * vy2 * cy0 * cxR * cxR + 2 * cxR * cxR * cy0 * vy2 * vy2 * vy1 * cyR * cyR * vx1 * vx2 + 2 * cxR * cxR * cy0 * vy2 * vy1 * vy1 * cyR * cyR * vx1 * vx2 - 4 * cyR * cyR * vx2 * vx1 * cxR * cxR * cy0 * cy0 * vy2 * vy1 + 4 * Math.Pow(cyR, 4) * vx2 * vx1 * cxR * cxR * vy2 * vy1 + 2 * cyR * cyR * vx2 * vx1 * cxR * cxR * cy0 * cy0 * vy2 * vy2 + 2 * cyR * cyR * vx2 * vx1 * cxR * cxR * cy0 * cy0 * vy1 * vy1 - 6 * cxR * cxR * Math.Pow(vy2, 3) * vy1 * cyR * cyR * cx0 * vx1 - 6 * cxR * cxR * vy2 * Math.Pow(vy1, 3) * cyR * cyR * cx0 * vx2 - 4 * cxR * cxR * vy2 * vy2 * vy1 * vy1 * cyR * cyR * vx1 * vx2 + 6 * cxR * cxR * vy2 * vy2 * vy1 * vy1 * cyR * cyR * cx0 * vx2 + 6 * cxR * cxR * vy2 * vy2 * vy1 * vy1 * cyR * cyR * cx0 * vx1 + 2 * cyR * cyR * vx2 * vx2 * cxR * cxR * cy0 * cy0 * vy2 * vy1 + 2 * cyR * cyR * vx1 * vx1 * cxR * cxR * cy0 * cy0 * vy2 * vy1 + 2 * cxR * cxR * Math.Pow(vy2, 3) * cyR * cyR * vx1 * vy1 * vx2 - 2 * cxR * cxR * Math.Pow(vy2, 3) * cyR * cyR * cx0 * vy1 * vx2 + 2 * cxR * cxR * Math.Pow(vy1, 3) * cyR * cyR * vx1 * vy2 * vx2 - 2 * cxR * cxR * Math.Pow(vy1, 3) * cyR * cyR * cx0 * vx1 * vy2))) / (-2 * cyR * cyR * vx2 * vx1 - 2 * cxR * cxR * vy2 * vy1 + cyR * cyR * vx2 * vx2 + cyR * cyR * vx1 * vx1 + cxR * cxR * vy2 * vy2 + cxR * cxR * vy1 * vy1);
		//    }
		//    else
		//    {
		//        var sq = Math.Sqrt(2 * cxR * cxR * vy1 * cy0 - cxR * cxR * cy0 * cy0 - vy1 * vy1 * cxR * cxR + cxR * cxR * cyR * cyR);
		//        crs[0] = (cx0 * cyR + sq) / cyR;
		//        crs[1] = vy1;
		//        crs[2] = (cx0 * cyR - sq) / cyR;
		//        crs[3] = vy1;
		//    }
		//    ocrs[0].X = (float)crs[0];
		//    ocrs[0].Y = (float)crs[1];
		//    ocrs[1].X = (float)crs[2];
		//    ocrs[1].Y = (float)crs[3];
		//    ocrs = ocrs
		//        // не пустая точка
		//        .Where(s => !s.X.isNaN() && !s.Y.isNaN())
		//        // Проверка принадлежности точки отрезку
		//        .Where(s => JointPointWithVector(s.X, s.Y, vx1, vy1, vx2, vy2))
		//        // Уникальность
		//        .Distinct()
		//        .ToArray();
		//    return ocrs.Length > 0;

		//    //return !crs0.X.isNaN() || !crs1.X.isNaN();
		//}

        #endregion
    }
}
